我正在构建一个使用COM库的.Net应用程序(我真的很擅长COM,但它是一个我需要使用class UserMessage < ActiveRecord::Base
end
注册的库,一旦在visual studio中引用它就说文件类型是ActiveX)。
在控制台应用程序中,我正在创建一个新的COM对象:
regsvr32
因此应用程序在主线程上同步初始化Api并等待static void Main(string[] args)
{
var comObj = new EikonDesktopDataAPI();
comObj.OnStatusChanged += EikonDesktopDataApi_OnStatusChanged;
comObj.Initialize();
Console.ReadLine();
}
private void EikonDesktopDataApi_OnStatusChanged(EEikonStatus status)
{
try{
throw new Exception("An exception 1.");
}catch(Exception ex){
throw new Exception("Tell the main thread." , ex);
}
}
。几秒钟后,触发Console.ReadLine()
事件。在调试时,我可以看到这是在工作线程上处理的。由于异常被抛出在另一个线程上,控制台应用程序不会崩溃。我怎么能抓住这个例外?
我尝试在Main方法上添加EikonDesktopDataApi_OnStatusChanged
,但这会导致事件永远不会被引发。
我也尝试过使用:
SLAThreadAttribute
但是也没有处理异常。
我找到的唯一方法&#34; catch&#34;例外是使用:
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
但这导致处理程序方法处理3个例外:AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException;
,然后是"An exception 1"
,最后是"Tell the main thread."
。这意味着我将处理甚至&#34;抓住&#34;异常是不切实际的。
有什么想法吗?
修改
我做了一个WPF应用程序,我从主线程实例化COM对象。初始化后,引发事件并且我的事件处理程序在MAIN线程上运行,但是如果我抛出异常,它不会使应用程序崩溃或引发"Exception has been thrown by the target of an invocation"
事件。我真的不明白为什么在主线程上抛出的异常什么都不做。