我刚刚发现我可以卸载DLL,它与C#中的函数FreeLibrary()隐式链接。我记得我不能用C ++做到这一点,但它在我的简单测试项目中运行良好。我想知道这在我的真实项目中是否也可以。 使用此方法是否安全?
答案 0 :(得分:2)
相当模糊,我将不得不假设您谈论通过pinvoke加载的DLL。是的,没有防止两次调用FreeLibrary()的保护。适用于C ++,以及明确加载的DLL。不适用于隐式加载的DLL,它们的引用计数为“无穷大”。
pinvoke marshaller在引擎盖下使用LoadLibrary(),在第一个[DllImport]函数执行时发生。 OS加载器只保留引用计数,每个LoadLibrary()调用都会增加它,FreeLibrary()会递减。当它达到0然后它被卸载。因此,如果你自己pinvoke LoadLibrary()并调用FreeLibrary()两次,那么DLL 会卸载。先前由映射DLL中的代码的内存映射文件使用的虚拟地址空间被释放,并且可以由后续分配再次使用。
安全,不,这不是一个想到的词。当您不小心调用DLL中的入口点时,您的程序将表现得非常糟糕。 pinvoke marshaller无法做任何事情,已经生成了本机方法的存根。 AccessViolationException的赔率是不错的,但不能保证。从技术上讲,任意代码执行都是可行的。
唯一真正安全的方法是确保卸载包含pinvoke代码的AppDomain。你没有得到任何帮助,只是你必须自己实施的规则。