2010-11-19 5 views
15

У меня есть неуправляемая dll C++, которая вызывается из приложения C#, я пытаюсь заставить приложение C# уловить все исключения, чтобы в случае DLL из-за неуправляемого исключения, пользователь получит полупристойное сообщение об ошибке (приложение C# - это веб-сервис, реализующий собственный HTTP-обработчик).C# не ловил необработанные исключения из неуправляемой библиотеки C++

Проблема заключается в том, что не все типы пойманы. Поэтому, если я создам следующее и выполняю приложение C#, тогда dll выдает ошибку, и все приложение завершается. Есть идеи?

Это создается в VS2005 и с помощью .NET Framework v2

C++ - test.h

#ifndef INC_TEST_H 
#define INC_TEST_H 

extern "C" __declspec(dllexport) void ProcessBadCall(); 

#endif 

C++ - test.cpp

#include <iostream> 
#include <vector> 

using namespace std; 

void ProcessBadCall() 
{ 
    vector<int> myValues; 
    int a = myValues[1]; 
    cout << a << endl; 
} 

C# - Program.cs

class Program 
{ 
    [DllImport("Test.dll", EntryPoint="ProcessBadCall")] 
    static extern void ProcessBadCall(); 

    static void Main(string[] args) 
    { 
    try 
    { 
     ProcessBadCall(); 
    } 
    catch (SEHException ex) 
    { 
     Console.WriteLine("SEH Exception: {0}", ex.Message); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("Exception: {0}", ex.Message); 
    } 
    } 
} 

dl l компилируется в соответствии с конфигурацией выпуска со следующими флагами компилятора.

/O2/GL/D "WIN32"/D "NDEBUG"/D "_CRT_SECURE_NO_WARNINGS"/D "_UNICODE"/D "UNICODE"/D "_WINDLL" /FD/EHa/MD/Fo "Release \" /Fd"Release\vc80.pdb»/ W4/WX/NOLOGO /с/Wp64/Zi/TP/errorReport: проворная

+0

Когда dll скомпилирована в режиме отладки, это не приведет к возникновению исключения SEH, но приведет к сбою утверждения. – smerlin

+0

К сожалению, пропустил этот бит, dll скомпилирован в режиме освобождения –

+0

Вы пробовали «catch {Console.WriteLine (« blah »);}«? – Polyfun

ответ

5

Попробуйте поймать с помощью ExternalException класс:

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.externalexception%28v=VS.100%29.aspx

И попробуйте скомпилировать вашу неуправляемую C++ DLL с асинхронной обработкой исключений (/ EHa). Похоже, вы получаете сообщение о нарушении чтения в своей DLL, которое является типом исключения async.

AFAIK, только .NET v4 и выше отключает доставку исключений async по умолчанию. Даже тогда вы можете добавить legacyCorruptedStateExceptionsPolicy = true в app.config, чтобы включить его. До этого он автоматически включается (убедитесь, что у вас установлено значение false в app.config).

Заметьте, что я лично считаю, что AVs в вашей неуправляемой DLL по своей сути является плохим (и опасным) в любом случае, и, вероятно, это правильное поведение .NET для просто прекращения приложения. Попробуйте вместо этого использовать std :: exception. Если вы настаиваете на том, чтобы ловить асинхронные исключения, лучшим способом было бы иметь thunking DLL, который обертывает попытку try-catch вокруг вызова потенциально вызванных ошибками вызовов функций. Опять же, high/not/recommended (хотя я вижу, как это было бы полезно при отладке ошибочной DLL).

+1

Еще не повезло –

+0

Обновлено с комментариями по перекомпиляции DLL с параметром компилятора/EHa. Пожалуйста, поймите, что идите. –

+0

То же самое я добавил флагов компилятора в исходный вопрос. Cheers –

Смежные вопросы