【问题标题】:C# COM application crash debuggingC# COM 应用程序崩溃调试
【发布时间】:2016-12-12 02:07:12
【问题描述】:

运行 .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 次,然后才会出现任何错误,并且在每次运行之间关闭两个应用程序。

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

【问题讨论】:

    标签: c# debugging logging com trace


    【解决方案1】:

    COM 互操作导致问题的典型情况是 IIS 使用当前 ISAPI.dll 的对象存在问题。请验证您的权限是否已在您的程序集中配置为与您当前版本的 IIS 一起使用>

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

    HTH

    【讨论】:

    • 这是一个运行 .NET Framework 4.5.2 的控制台应用程序
    • 如果您使用 msvsmon.exe 调试您的服务器,您可能需要查看此 URL,msdn.microsoft.com/en-us/library/y7f5zaaa.aspx。远程调试应该可以帮助您查看转储文件,但我觉得您的代码中正在发生竞争条件,可能需要创建一些原子操作来修复竞争。
    猜你喜欢
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多