【发布时间】:2011-05-12 12:41:45
【问题描述】:
我有一个从 C# 应用程序调用的非托管 C++ dll,我正在尝试让 C# 应用程序捕获所有异常,以便在 dll 由于非托管异常而失败时用户将收到一条不太像样的错误消息(C# 应用程序是一个实现其自己的 http 处理程序的 Web 服务)。
我遇到的问题是并非所有类型都被捕获。因此,如果我创建以下内容并执行 C# 应用程序,则 dll 会引发错误并且整个应用程序终止。有什么想法吗?
这是在 VS2005 中创建并使用 .Net framework v2
C++ - 测试.h
#ifndef INC_TEST_H
#define INC_TEST_H
extern "C" __declspec(dllexport) void ProcessBadCall();
#endif
C++ - 测试.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);
}
}
}
正在使用以下编译器标志在发布配置下编译 dll。
/O2 /GL /D "WIN32" /D "NDEBUG" /D "_CRT_SECURE_NO_WARNINGS" /D "_UNICODE" /D "UNICODE" /D "_WINDLL" /FD /EHa /MD /Fo“释放” /Fd"Release\vc80.pdb" /W4 /WX /nologo /c /Wp64 /Zi /TP /errorReport:prompt
【问题讨论】:
-
在调试模式下编译dll时,不会引发SEH Exception,但会导致断言失败。
-
对不起,漏掉了,dll是在release模式下编译的
-
你试过"catch { Console.WriteLine("blah"); }"吗?
-
刚试过,还是不行。似乎正在发生的事情是 DLL 引发了一个未处理的异常,该异常立即终止了自身和 c# 应用程序
-
您应该在抛出异常的同一运行时捕获异常。否则堆栈展开和析构函数调用可能无法按预期工作。而且您通常无法从访问冲突中恢复,因此您应该在显示错误后终止应用程序。
标签: c# c++ dll exception-handling pinvoke