您应该从托管对象的Dipose
方法中删除您的非托管对象。如果您的代码在垃圾收集器到达它之前没有调用,您还应该调用Dispose
该方法。亚当罗宾逊的回答更好地说明了这一点。Finalize
Dispose
因此,如果您对 Dispose 调用(并使用using
块)很勤奋,那么您不应该出现关机崩溃。
编辑:我认为问题实际上是在终结器运行之前卸载了非托管 DLL。老“一旦应用程序关闭,就无法保证卸载的顺序”。
也许您可以尝试在托管 C++ 程序集中使用非托管资源?这样你就知道 DLL 在你完成之前不会爆炸,你不必做丑陋的 P/Invoke 东西。
这是来自 MSDN 的示例:
ref struct A {
// destructor cleans up all resources
~A() {
// clean up code to release managed resource
// ...
// to avoid code duplication
// call finalizer to release unmanaged resources
this->!A();
}
// finalizer cleans up unmanaged resources
// destructor or garbage collector will
// clean up managed resources
!A() {
// clean up code to release unmanaged resource
// ...
}
};
更多在这里http://msdn.microsoft.com/en-us/library/ms177197.aspx
上述模式与 C# 模式相同,但您可能会在托管 C++ 程序集中使用非托管资源。如果您真的必须在非托管 DLL(而不是静态非托管库)中拥有这些,那么您将被卡住,您将遇到相同的关闭问题。