2011-03-29 5 views
0

C# 기반 GUI 응용 프로그램에서 호출되는 C++/CLI에서 DLL을 코딩하고 있습니다. 내 DLL에서 삼키지 않으면 GUI 코드의 최종 catch 블록에서 처리되는 사용자 정의 예외 (Exception 클래스에서 파생 됨)를 발생시킵니다.짝수 처리기 코드 블록에서 처리되지 않은 예외가 발생했습니다.

Im 내 DLL SerialPort::DataReceived 이벤트를 수신하는 처리기를 구현했습니다. 잘못된 패킷을 받으면 외부 예외 try-catch 블록에서 재 작성되는 사용자 정의 예외를 발생시킵니다. GUI는이 사용자 정의 예외를 표시합니다. 그러나 어떤 이유로이 블록에서 발생한 예외는 다시 발생하지 않습니다. 대신 디버그 모드에서 "처리되지 않은 예외"메시지가 나타납니다. exe를 (릴리스 폴더에서) exe를 두 번 클릭하여 직접 실행하면 충돌이 발생합니다. 분명히이 이벤트 처리기 메서드에서 발생하는 예외는 GUI에 의해 처리되지 않습니다. 아니면 내 DLL에서 GUI로 전달되지 않을 수도 있습니다. 그것은 내 DLL의 다른 부분에 대한 문제를 만들지 않습니다. 이 다른 동작을 생각할 수있는 유일한 이유는 이벤트 처리기에 호출자가 없다는 것입니다. 내 추측이 맞습니까? 또는 다른 이유가 있습니다. 이 문제를 어떻게 처리 할 수 ​​있는지에 대한 단서가 있습니까? 내 응용 프로그램이 충돌하는 것을 원하지 않습니다. 메시지를 GUI에서 사용자에게 표시 할 수 있도록 응용 프로그램이 직렬 포트와의 통신을 중지 할 수 있도록 예외를 발생시키고 싶습니다.

답변

1

해당 이벤트 처리기를 시작하기 전에 UI 스레드로 전환해야합니다. 일반적으로 System::Threading::SynchronizationContext으로 수행되지만, WinForms를 사용하는 경우 System::Windows::Forms::Control::BeginInvoke 또는 System::Windows::Forms::Control::Invoke을 사용할 수도 있습니다.

+0

감사합니다. 그것은 옳은 대답입니다. 불행히도 프로젝트에서 상호 참조 문제가 발생하기 때문에 Invoke를 사용할 수 없습니다. 대신 예외를 발생시키는 대신이 조건을 알리기 위해 별도의 이벤트를 만들었습니다. 이벤트 처리기는 예외 처리기와 거의 동일한 기능을 수행합니다. – DPD

관련 문제