private void Dispose(bool disposing) { if (disposing) { if (!_dllHandle.Equals(IntPtr.Zero)) { var dllCanUnloadNowPtr = Win32NativeMethods.GetProcAddress(_dllHandle, "DllCanUnloadNow"); if (!dllCanUnloadNowPtr.Equals(IntPtr.Zero)) { var dllCanUnloadNow = (DllCanUnloadNow)Marshal.GetDelegateForFunctionPointer(dllCanUnloadNowPtr, typeof(DllCanUnloadNow)); if (dllCanUnloadNow() != 0) { return; //there are still live objects returned by the dll, so we should not unload the dll } } Win32NativeMethods.FreeLibrary(_dllHandle); _dllHandle = IntPtr.Zero; } } }