daz*_*ler 16 c# c++ dll pinvoke exception-handling
我有一个从C#应用程序调用的非托管C++ DLL,我试图让C#应用程序捕获所有异常,以便在由于非托管异常导致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
Run Code Online (Sandbox Code Playgroud)
C++ - Test.cpp
#include <iostream>
#include <vector>
using namespace std;
void ProcessBadCall()
{
vector<int> myValues;
int a = myValues[1];
cout << a << endl;
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
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该类捕获:
并尝试使用异步异常处理(/ EHa)编译非托管C++ DLL.看起来你的DLL中有一个读取访问冲突,这是一种异步异常.
AFAIK,只有.NET v4及更高版本默认禁用异步异常的传递.即使这样,您也可以将legacyCorruptedStateExceptionsPolicy = true添加到app.config以启用它.在此之前,它会自动启用(检查是否已在app.config中将其设置为false).
请注意,我个人认为,无论如何,非托管DLL中的AV本质上都是坏的(并且是危险的),并且它可能是.NET直接终止应用程序的正确行为.尝试抛出std :: exception.如果你坚持捕获异步异常,最好的方法是让一个thunking DLL包装try-catch-all围绕调用潜在的bug函数调用.再次,高度/非/推荐(虽然我可以看到它在调试行为不当的DLL时有用).
| 归档时间: |
|
| 查看次数: |
14066 次 |
| 最近记录: |