如何在C#中使用 DllImport
载入的 DLL?
我该如何卸载已经被加载进来的 DLL?
FreeLibrary
调用卸载了本机模块,即使FreeLibrary
调用也只能通过P/invoke进行。难道不是这样吗? - RBTFreeLibrary()
,所以它不知道清除它自己在之前加载的任何引用。如果FreeLibrary()
是通过GetProcAddress()
而不是DllImport
被调用呢?那么CLR将不得不安装一个钩子到FreeLibrary()
本身来拦截所有调用。 - Remy Lebeau当您调用P/Invoke函数时,这应该会释放先前加载的模块。
[DllImport("kernel32", SetLastError=true)]
static extern bool FreeLibrary(IntPtr hModule);
public static void UnloadModule(string moduleName)
{
foreach(ProcessModule mod in Process.GetCurrentProcess().Modules)
{
if(mod.ModuleName == moduleName)
{
FreeLibrary(mod.BaseAddress);
}
}
}
根据彼得的建议,这对我有用:
[DllImport("kernel32", SetLastError = true)]
private static extern bool FreeLibrary(IntPtr hModule);
public static void UnloadImportedDll(string DllPath)
{
foreach (System.Diagnostics.ProcessModule mod in System.Diagnostics.Process.GetCurrentProcess().Modules)
{
if (mod.FileName == DllPath)
{
FreeLibrary(mod.BaseAddress);
}
}
}
因为我在寻找信息时遇到了这里的资料,所以我想我将回馈我最终解决 Sixense SDK 在 OSX 上在 Unity 中出现的问题所采取的措施。您将看到其中一个在 OSX 上动态加载/卸载 dylib 的实现: