2010-07-07 72 views
4

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

+0

它是什么样的崩溃?在任何情况下,您都无法保证能够运行这种清理代码。 (例如,考虑一下如果用户通过任务管理器杀死你的应用程序会发生什么。) – 2010-07-07 07:50:13

+0

他们是否在一个out-proc服务器? – sharptooth 2010-07-07 07:51:04

+0

>它是什么样的崩溃? 我正在测试控制台应用程序。我只是通过关闭按钮关闭它(我认为它类似于通过任务管理器杀死) >他们在一个out-proc服务器? 是的。 >这是一个WinForms应用程序吗? 第 – 2010-07-07 08:01:48

回答

1

控制台关闭按钮不一定会导致崩溃 - 请查看SetConsoleCtrlHandler函数。这可以让你安装一个当用户点击关闭时被调用的处理程序,允许你清理。

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

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

+0

我明白了。谢谢。我添加了CriticalFinalizerObject。我希望这足以覆盖大部分案件。如果不是,我会尝试实施第二个应用程序(如你所说)。 – 2010-07-07 09:07:27

+0

“看门狗”应用程序。 – AMissico 2012-08-04 01:38:42

1

如果客户端崩溃,COM将使out-proc服务器清理对象本身,但只有没有运行任何方法的对象。运行在对象上的所有正在运行的方法都需要在可以释放该对象之前完成。有两种可靠的解决方案:使所有方法都可以在很短的时间内运行,或者创建一个单独的进程来处理COM服务器。