有没有办法在应用程序崩溃时释放com对象?
我有以下代码:
public class Application
: IDisposable
{
private bool disposed = false;
private object realApplication;
public void Dispose()
{
Dispose(true);
}
private void Dispose(bool disposing)
{
if (!disposed) {
if (realApplication!=null) {
Marshal.ReleaseComObject(realApplication);
realApplication = null;
}
disposed = true;
}
GC.SuppressFinalize(this);
}
...
~Application()
{
Dispose(false);
}
}
但它只在正常应用程序关闭时释放com对象。
答案 0 :(得分:3)
尝试让Application
班继承CriticalFinalizerObject。
答案 1 :(得分:1)
控制台关闭按钮不一定会导致崩溃 - 请查看SetConsoleCtrlHandler
功能。这允许您安装在用户单击关闭时调用的处理程序,允许您清理。
您不能保证在任何情况下都能清理;很容易杀死你的应用程序而不给它一个清理的机会。例如,您的应用永远无法检测到通过任务管理器将其杀死的用户。
如果应用程序在所有情况下都清理至关重要,那么您可能需要查看第二个应用程序,该应用程序监视第一个应用程序并在需要时进行清理。
答案 2 :(得分:1)
如果客户端崩溃,COM将使out-proc服务器清理对象本身,但只有未运行任何方法的对象。在释放该对象之前,需要在对象上运行所有正在运行的方法。有两个可靠的解决方案:要么让所有方法都运行很短的时间,要么制定一个单独的流程来处理COM服务器。