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

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


这是什么样的崩溃?不能保证在所有情况下都能运行此类清理代码。(例如,考虑用户通过任务管理器终止应用程序会发生什么。) - Tim Robinson
他们在一个外部进程服务器中吗? - sharptooth
这是什么样的崩溃? 我正在测试控制台应用程序。我只是通过关闭按钮关闭它(我认为这类似于通过任务管理器杀死它)。 他们在一个外部进程服务器中吗? 是的。 这是一个WinForms应用程序吗? 不是。 - Marat Faskhiev
3个回答

3

1

控制台关闭按钮不必导致崩溃 - 看看SetConsoleCtrlHandler函数。这使您可以安装一个处理程序,当用户单击关闭时调用它,允许您进行清理。

您无法保证在所有情况下都能够清理; 很容易在不给予其清理的机会的情况下终止应用程序。例如,您的应用程序将永远无法检测到用户通过任务管理器终止它。

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


我明白了,谢谢。我添加了 CriticalFinalizerObject。希望它足以涵盖大多数情况。如果不行,我会尝试实现第二个应用程序(如你所说)。 - Marat Faskhiev

1

如果客户端崩溃,COM 将使外部进程服务器清理对象本身,但仅限于未运行任何方法的对象。在释放该对象之前,所有正在运行的方法都需要完成。有两个可靠的解决方案:要么让所有方法运行一个非常短的时间,要么创建一个单独的进程来处理 COM 服务器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接