C#没有捕获非托管C ++ DLL的未处理exception

我有一个从C#应用程序调用的非托管C ++ dll,我正在尝试使用C#应用程序捕获所有exception,以便在由于非托管exception导致dll失败的情况下,用户将获得半合适的错误消息(C#app是一个实现它自己的http处理程序的Web服务)。

我遇到的问题是并非所有类型都被捕获。 因此,如果我创建以下内容并执行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  #include  using namespace std; void ProcessBadCall() { vector 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); } } } 

dll在发布配置下使用以下编译器标志进行编译。

/ O2 / GL / D“WIN32”/ D“NDEBUG”/ D“_CRT_SECURE_NO_WARNINGS”/ D“_UNICODE”/ D“UNICODE”/ D“_WINDLL”/ FD / EHa / MD / Fo“Release \”/ Fd“发布\ vc80.pdb“/ W4 / WX / nologo / c / Wp64 / Zi / TP / errorReport:提示

尝试使用ExternalException类捕获:

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

并且,尝试使用异步exception处理(/ EHa)编译非托管C ++ DLL。 看起来您在DLL中遇到了一种读取访问冲突,这是一种异步exception。

AFAIK,只有.NET v4及更高版本默认禁用异步exception的传递。 即使这样,您也可以将legacyCorruptedStateExceptionsPolicy = true添加到app.config以启用它。 在此之前,它会自动启用(检查是否已在app.config中将其设置为false)。

请注意,我个人认为,无论如何,非托管DLL中的AV本质上都是坏的(并且是危险的),并且它可能是.NET直接终止应用程序的正确行为。 尝试抛出std :: exception。 如果你坚持捕获异步exception,最好的方法是让一个thunking DLL包装try-catch-all围绕调用潜在的bug函数调用。 再次,高度/非/推荐(虽然我可以看到它在调试行为不当的DLL时有用)。