Я работаю над приложением WPF, которое внутренне вызывает C / C ++ DLL, используя PInvoke. В режиме отладки DLL при возникновении ошибки функция выдает исключение, которое в основном является структурой, определенной с конкретным сообщением об ошибке и кодом приложения, специфичным для модуля. Это отличается от обычной регистрации ошибок Win32. Теперь моя проблема в том, что я хочу поймать исключение, сгенерированное DLL.
Если вы используете функцию try catch для функции Marshalled, .NET только что сообщил мне, что во внешнем модуле произошла ошибка.
try
{
// Marshalled function called
}
catch(Exception ex)
{
MessageBox.show(ex.Message);
}
Теперь я понимаю, что исключение C / C + = DLL не является классом, производным от класса исключений .NET, поэтому .NET не сможет правильно его упорядочить. Я не могу изменить C ++ DLL на управляемую или внести какие-либо изменения исходного кода в код DLL.
Я видел аналогичный пост в MSDN с решением, предоставленным в VC ++. NET, где каждая функция DLL создается в оболочке, генерирующей исключение, полученное из класса .NET.
http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/0624f3b3-5244-4cb8-be9c-29d464975d20
Однако для этого потребуется еще один проект сборки .net, который создаст оболочки около 200 функций и структур в VC ++. NET. Прямо сейчас все функции DLL были импортированы в приложение WPF с помощью PInvoke, поэтому было бы предпочтительным любое дополнение к существующему сценарию.