2011-03-29 103 views
0

我在C++/CLI中编写了一个DLL,它在基于C#的GUI应用程序中调用。我抛出一个自定义的异常(从Exception类派生),如果不在我的DLL中吞噬,则在GUI代码的最后一个catch块中处理。它适用于所有抛出,保存一个:偶处理程序代码块中未处理的异常

我的DLL我已经实现了一个处理程序,将听取SerialPort::DataReceived事件。如果我得到一个不正确的数据包,我会引发一个自定义的异常,它会在外部的try-catch块中重新生成。 GUI应该显示这个自定义异常。但由于某种原因,在该块中引发的异常不会被重新抛出。相反,我在调试模式下收到“未处理的异常”消息。当我通过双击exe(在发布文件夹中)直接运行exe时,它只是崩溃。显然,在这个事件处理程序方法中引发的异常不由GUI处理。或者,也许他们没有从我的DLL传递给GUI。它不会为我的dll的其他部分造成问题。我认为这种不同行为的唯一原因是事件处理程序没有调用者。我的猜测是正确的吗?或者是有其他原因。有关我如何处理这个问题的任何线索?我不希望我的应用程序崩溃。我只是想引发一个异常,以便可以在GUI中向用户显示消息,并且应用程序可以停止与串行端口进行通信。

回答

1

您需要在从该事件处理程序中抛出之前切换到UI线程。这通常通过System::Threading::SynchronizationContext完成,但如果您使用WinForms,则可以使用System::Windows::Forms::Control::BeginInvokeSystem::Windows::Forms::Control::Invoke

+0

谢谢。这是正确的答案。不幸的是,我不能使用Invoke,因为它会在项目中创建一个交叉引用问题。相反,我创建了一个单独的事件来指示这种情况,而不是引发异常。事件处理程序将执行与我的异常处理程序几乎相同的操作。 – DPD 2011-04-05 09:00:54