在应用程序崩溃时释放com对象

时间:2010-07-07 07:44:00

标签: c# .net com

有没有办法在应用程序崩溃时释放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对象。

3 个答案:

答案 0 :(得分:3)

尝试让Application班继承CriticalFinalizerObject

答案 1 :(得分:1)

控制台关闭按钮不一定会导致崩溃 - 请查看SetConsoleCtrlHandler功能。这允许您安装在用户单击关闭时调用的处理程序,允许您清理。

您不能保证在任何情况下都能清理;很容易杀死你的应用程序而不给它一个清理的机会。例如,您的应用永远无法检测到通过任务管理器将其杀死的用户。

如果应用程序在所有情况下都清理至关重要,那么您可能需要查看第二个应用程序,该应用程序监视第一个应用程序并在需要时进行清理。

答案 2 :(得分:1)

如果客户端崩溃,COM将使out-proc服务器清理对象本身,但只有未运行任何方法的对象。在释放该对象之前,需要在对象上运行所有正在运行的方法。有两个可靠的解决方案:要么让所有方法都运行很短的时间,要么制定一个单独的流程来处理COM服务器。