2011-03-29 111 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