Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果COM应用程序崩溃,如何正确处理COM对象?_C#_Com_Com Interop - Fatal编程技术网

C# 如果COM应用程序崩溃,如何正确处理COM对象?

C# 如果COM应用程序崩溃,如何正确处理COM对象?,c#,com,com-interop,C#,Com,Com Interop,问题是: 我必须通过COM互操作从C#.NET应用程序调用应用程序。我已经编写了一个包装器类来处理COM的东西,所有这些都工作得很好 public sealed class ComWrapper : IDisposable { private Application comApplication = new Application(); // Referenced COM assembly. private bool disposed; // Several metho

问题是:

我必须通过COM互操作从C#.NET应用程序调用应用程序。我已经编写了一个包装器类来处理COM的东西,所有这些都工作得很好

public sealed class ComWrapper : IDisposable
{
    private Application comApplication = new Application(); // Referenced COM assembly.
    private bool disposed;

    // Several methods to interact with the com application.

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    private void Dispose(bool disposing)
    {
         if(disposed)
             return;

         try
         {
             if(comApplication != null && Marshal.IsComObject(comApplication));
                 Marshal.ReleaseComObject(comApplication);
         }
         finally
         {
             comApplication = null;
         }

         disposed = true;
    }
}
我可以调用应用程序,使用它的方法,只要COM应用程序运行正常,所有这些都可以工作

但是,如果应用程序崩溃(数据库连接丢失时有时会发生这种情况),可执行文件将保持加载状态。在Process Explorer中,即使在捕获
COMException
后手动调用垃圾收集器,我也可以通过
werfault.exe
进程在
svchost.exe
下查看应用程序的进程

catch(COMException)
{
    app.Dispose();
    app = null;
    GC.Collect();
    GC.WaitForPendingFinalizers();
}

如何正确处置COM对象,使其即使在COM应用程序崩溃时也能正确退出应用程序并关闭进程?我曾考虑确定所述应用程序的进程ID并使用
process.Kill()
,但这对我来说似乎有点难看。那么,终止和释放崩溃应用程序的资源的合适方式是什么呢?

如果这是一个外部COM服务器,那么您无法从客户端执行任何操作

在你这边,除了你已经在做的事情之外,你什么也做不了。处置COM对象,您就完成了。如果COM应用程序仍处于活动状态,则会有一些错误处理程序导致应用程序无法关闭。可能它显示了一条错误消息

但我想知道,您是否看到了一个SVCHOST进程。这是服务吗?如果是这样,SCM应管理故障。COM通常在SVCHOST.EXE中承载外部服务器

因此,可能您没有提供足够的关于所使用的外部流程类型的信息


顺便说一句:调用GC.Collect从来都不是明智之举……;)

如果这是一个外部COM服务器,则无法从客户端执行任何操作

在你这边,除了你已经在做的事情之外,你什么也做不了。处置COM对象,您就完成了。如果COM应用程序仍处于活动状态,则会有一些错误处理程序导致应用程序无法关闭。可能它显示了一条错误消息

但我想知道,您是否看到了一个SVCHOST进程。这是服务吗?如果是这样,SCM应管理故障。COM通常在SVCHOST.EXE中承载外部服务器

因此,可能您没有提供足够的关于所使用的外部流程类型的信息


顺便说一句:调用GC.Collect从来都不是明智之举……;)

实际上,它是一个普通的windows应用程序,而不是服务。如果您通过COM启动它,它似乎被配置为在SVCHOST下启动。(我认为这不是有史以来设计的最好的程序,但可悲的是,我被它卡住了)。但我似乎已经知道会发生什么。。。如果应用程序硬崩溃,它会创建另一个孤立的进程。。。乍一看,手柄非常相似,我没有注意到区别。所以我想我必须通过
进程进行清理。Kill
否则它不会再次启动,因为它会与所有实例交换消息,而孤立的实例会阻塞。实际上,它是一个普通的windows应用程序,而不是服务。如果您通过COM启动它,它似乎被配置为在SVCHOST下启动。(我认为这不是有史以来设计的最好的程序,但可悲的是,我被它卡住了)。但我似乎已经知道会发生什么。。。如果应用程序硬崩溃,它会创建另一个孤立的进程。。。乍一看,手柄非常相似,我没有注意到区别。因此,我想我必须通过
Process.Kill
进行清理,否则它不会再次启动,因为它会与所有实例交换消息,而孤立的实例会阻塞。这只是进程外COM的责任之一,也是它很少被使用的原因之一。它确实帮助Java在90年代后期的中间件战争中成为一个重要的赢家。操作系统有一个用于孤立服务器的垃圾收集器,它并不急于杀死它们。至少10分钟后。它并不总是有效的,因为我从来没有意识到的原因,例如Office应用程序不会被杀死。这只是进程外COM的责任之一,也是它很少被使用的原因之一。它确实帮助Java在90年代后期的中间件战争中成为一个重要的赢家。操作系统有一个用于孤立服务器的垃圾收集器,它并不急于杀死它们。至少10分钟后。它并不总是有效的,因为我从来没有意识到的原因,例如,Office应用程序不会被杀掉。