Обработка пользовательских исключений из C ++ DLL - .NET PInvoke / Marshalling - PullRequest
1 голос
/ 19 июля 2011

Я работаю над приложением 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, поэтому было бы предпочтительным любое дополнение к существующему сценарию.

1 Ответ

1 голос
/ 21 июля 2011

Если вы хотите продолжать использовать P / invoke, как вы указали в комментариях, тогда ваш единственный вариант - перехватить исключения на границе DLL.Затем вы можете передать детали в управляемое приложение, используя коды ошибок, а не исключения.Если вы хотите использовать P / invoke, вы не можете разрешить исключениям пересекать границу DLL.

...