C# 动态加载未经管理的DLL后是否应显式调用FreeLibrary

C# 动态加载未经管理的DLL后是否应显式调用FreeLibrary,c#,pinvoke,dllimport,C#,Pinvoke,Dllimport,我有一个静态类NativeMethods包含用[dlliport]修饰的方法。 我想在NativeMethods静态构造函数中使用LoadLibrary动态加载DLL 我是否应该在某些(进程/应用域?)关闭事件上显式调用FreeLibrary? 让操作系统在进程关闭时隐式执行清理是仅为崩溃保留的还是正常情况?您应该显式执行此操作。正确的方法是创建一个保存库引用的类,该类在它的终结器中释放引用,就像使用任何其他长期存在的本机资源一样 等待操作系统清理是很有诱惑力的(它会在进程退出时清理,不用担心)

我有一个
静态类NativeMethods
包含用
[dlliport]
修饰的方法。 我想在
NativeMethods
静态构造函数中使用LoadLibrary动态加载DLL

我是否应该在某些(进程/应用域?)关闭事件上显式调用FreeLibrary?
让操作系统在进程关闭时隐式执行清理是仅为崩溃保留的还是正常情况?

您应该显式执行此操作。正确的方法是创建一个保存库引用的类,该类在它的终结器中释放引用,就像使用任何其他长期存在的本机资源一样


等待操作系统清理是很有诱惑力的(它会在进程退出时清理,不用担心),但它会在扩展软件时引入一些难以跟踪的问题,从长远来看,它会使许多问题(如挂起的线程)变得更糟。

为什么需要这样做
dlliport
自动执行此操作,并在程序退出时卸载库。无论如何,您可以使用带PInvoke的LoadLibrary来完成这项工作,当程序退出时,它也会被卸载。我想您不应该将“[DllImport]”与“LoadLibrary”混淆,但从您的问题来看,不清楚您是否要这样做,或者是否要用动态绑定替换当前的[DllImport]解决方案。请澄清。我想动态地做,只是不确定为什么我应该为每个方法编写绑定代码,而属性可以为我完成所有这些。我只需要提供它的dll。Dll位于嵌入式资源中。