Browse Source

Adding Linux native dll loading

Former-commit-id: bf4c36486c3e3db4883d766162c4cf5c3c32da74
af/merge-core
James South 12 years ago
parent
commit
79a0201003
  1. 11
      src/ImageProcessor/Configuration/NativeBinaryFactory.cs
  2. 28
      src/ImageProcessor/Configuration/NativeMethods.cs
  3. 3
      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);
}
}

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

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5b7215a59e681f4100078aeb74b5d423dcea54b9d2ea924a2bb7c74b2db3ee3a
size 26227
Loading…
Cancel
Save