Browse Source

Adding Linux native dll loading

Former-commit-id: 5993e028f751f80aaa9fe82a33831a7fef57e02b
pull/17/head
James South 12 years ago
parent
commit
0d2d1f76b6
  1. 11
      src/ImageProcessor/Configuration/NativeBinaryFactory.cs
  2. 28
      src/ImageProcessor/Configuration/NativeMethods.cs
  3. BIN
      src/ImageProcessorConsole/images/output/rotate.jpg

11
src/ImageProcessor/Configuration/NativeBinaryFactory.cs

@ -94,7 +94,7 @@ namespace ImageProcessor.Configuration
Assembly assembly = Assembly.GetExecutingAssembly();
string targetBasePath = new Uri(assembly.Location).LocalPath;
string targetPath = Path.GetFullPath(Path.Combine(targetBasePath, "..\\" + folder + "\\" + name));
// Copy the file across if necessary.
FileInfo fileInfo = new FileInfo(targetPath);
bool rewrite = true;
@ -122,8 +122,13 @@ namespace ImageProcessor.Configuration
try
{
#if !__MonoCS__
// Load the binary into memory.
pointer = NativeMethods.LoadLibrary(targetPath);
#else
// Load the binary into memory. The second parameter forces it to load immediately.
pointer = NativeMethods.dlopen(targetPath, 2);
#endif
}
catch (Exception ex)
{
@ -187,9 +192,13 @@ namespace ImageProcessor.Configuration
{
IntPtr pointer = nativeBinary.Value;
#if !__MonoCS__
// According to http://stackoverflow.com/a/2445558/427899 you need to call this twice.
NativeMethods.FreeLibrary(pointer);
NativeMethods.FreeLibrary(pointer);
#else
NativeMethods.dlclose(pointer);
#endif
}
}
}

28
src/ImageProcessor/Configuration/NativeMethods.cs

@ -40,5 +40,33 @@ namespace ImageProcessor.Configuration
/// <returns>If the function succeeds, the return value is nonzero; otherwise zero.</returns>
[DllImport("kernel32", CharSet = CharSet.Auto)]
public static extern bool FreeLibrary(IntPtr hModule);
/// <summary>
/// Loads the specified module into the address space of the calling process.
/// The specified module may cause other modules to be loaded.
/// </summary>
/// <param name="libname">
/// The name of the module. This can be either a library module or
/// an executable module.
/// </param>
/// <param name="flags">
/// The flag indicating whether to load the library immediately or lazily.
/// </param>
/// <returns>
/// If the function succeeds, the return value is a handle to the module; otherwise null.
/// </returns>
[System.Runtime.InteropServices.DllImport("libdl")]
public static extern IntPtr dlopen(string libname, int flags);
/// <summary>
/// Frees the loaded dynamic-link library (DLL) module and, if necessary, decrements its reference count.
/// When the reference count reaches zero, the module is unloaded from the address space of the calling
/// process and the handle is no longer valid.
/// </summary>
/// <param name="hModule">A handle to the loaded library module.
/// The LoadLibrary, LoadLibraryEx, GetModuleHandle, or GetModuleHandleEx function returns this handle.</param>
/// <returns>If the function succeeds, the return value is nonzero; otherwise zero.</returns>
[System.Runtime.InteropServices.DllImport("libdl")]
public static extern int dlclose(IntPtr hModule);
}
}

BIN
src/ImageProcessorConsole/images/output/rotate.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Loading…
Cancel
Save