C#COM应用程序崩溃调试

时间:2016-08-05 15:32:49

标签: c# debugging logging com tracing

运行.NET 4.5.2(app1)的C#控制台应用程序打开一个COM应用程序(app2),并使用该app2的API进行一些操作。到目前为止,所有工作都是成功的,但有时当app1尝试关闭app2时,app2会永久挂起。

如果app2的进程以任务管理器结束,则app1报告拒绝访问。是否会发生这种情况,因为已终止的进程不再可用,或者是否因为它阻止app1中的某个线程而发生,并且在允许该线程继续之前无法报告该错误?

用于终止app2的代码是

    private static void CloseSW(SldWorks swApp, Process sw_proces)
    {
        // Close with API call            
        if (Task.Run(() => { swApp.CloseAllDocuments(true); swApp.ExitApp(); }).Wait(TimeSpan.FromSeconds(20)))
            return;

        // Kill process if API call failed
        if (Task.Run(() => { SWHelper.CloseSW(sw_proces); }).Wait(TimeSpan.FromSeconds(20)))
            return;

        // Unable to close SolidWorks, ignore error and continue      
        // This will eventually cause SolidWorks to crash and the crash handler will take over
    }

此代码永远不会超过40秒完成,但COM互操作可能会导致一些意外行为?

我无法在开发计算机上重现此错误。什么是追踪确切故障点的最佳方法?故障可能不是在CloseSW中,而是在此之前的某些点。是否有更好的方法来跟踪错误而不是将每一行写入日志文件?

值得注意的是,此代码在出现任何错误之前可以运行60到150次运行,并且每次运行都会关闭这两个应用程序。

我可以控制远程环境,因此远程调试是一种选择,但我以前从未设置过。

1 个答案:

答案 0 :(得分:1)

通常使用COM interop导致问题的是IIS使用当前的ISAPI.dll与对象有问题。请验证您的程序集中是否已配置权限以使用当前版本的IIS>

帮助协助的几个问题是,您使用的是哪个框架版本,哪个版本的IIS以及您的应用程序池用于框架的是什么。

HTH