运行.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次运行,并且每次运行都会关闭这两个应用程序。
我可以控制远程环境,因此远程调试是一种选择,但我以前从未设置过。
答案 0 :(得分:1)
通常使用COM interop导致问题的是IIS使用当前的ISAPI.dll与对象有问题。请验证您的程序集中是否已配置权限以使用当前版本的IIS>
帮助协助的几个问题是,您使用的是哪个框架版本,哪个版本的IIS以及您的应用程序池用于框架的是什么。
HTH