diff --git a/src/ImageProcessor/Configuration/NativeBinaryFactory.cs b/src/ImageProcessor/Configuration/NativeBinaryFactory.cs
index 741da61e2..e210aa036 100644
--- a/src/ImageProcessor/Configuration/NativeBinaryFactory.cs
+++ b/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
}
}
}
diff --git a/src/ImageProcessor/Configuration/NativeMethods.cs b/src/ImageProcessor/Configuration/NativeMethods.cs
index a20b5a86f..6c1ab9805 100644
--- a/src/ImageProcessor/Configuration/NativeMethods.cs
+++ b/src/ImageProcessor/Configuration/NativeMethods.cs
@@ -40,5 +40,33 @@ namespace ImageProcessor.Configuration
/// If the function succeeds, the return value is nonzero; otherwise zero.
[DllImport("kernel32", CharSet = CharSet.Auto)]
public static extern bool FreeLibrary(IntPtr hModule);
+
+ ///
+ /// Loads the specified module into the address space of the calling process.
+ /// The specified module may cause other modules to be loaded.
+ ///
+ ///
+ /// The name of the module. This can be either a library module or
+ /// an executable module.
+ ///
+ ///
+ /// The flag indicating whether to load the library immediately or lazily.
+ ///
+ ///
+ /// If the function succeeds, the return value is a handle to the module; otherwise null.
+ ///
+ [System.Runtime.InteropServices.DllImport("libdl")]
+ public static extern IntPtr dlopen(string libname, int flags);
+
+ ///
+ /// 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.
+ ///
+ /// A handle to the loaded library module.
+ /// The LoadLibrary, LoadLibraryEx, GetModuleHandle, or GetModuleHandleEx function returns this handle.
+ /// If the function succeeds, the return value is nonzero; otherwise zero.
+ [System.Runtime.InteropServices.DllImport("libdl")]
+ public static extern int dlclose(IntPtr hModule);
}
}
diff --git a/src/ImageProcessorConsole/images/output/rotate.jpg b/src/ImageProcessorConsole/images/output/rotate.jpg
new file mode 100644
index 000000000..a9b8b74dc
--- /dev/null
+++ b/src/ImageProcessorConsole/images/output/rotate.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5b7215a59e681f4100078aeb74b5d423dcea54b9d2ea924a2bb7c74b2db3ee3a
+size 26227