我有一个由C#应用程序组成的项目,该应用程序调用了几个C ++ / CLI DLL。如果我在本机代码中遇到Visual Studio C运行时库致命错误,则似乎无法捕获它。
举一个简单的例子,如果我把它放在本机代码中:
wchar_t buf[1]; ::wcscpy_s(buf, 1, L"ab");
应用程序将崩溃(在发布版本中)。它不会抛出异常而我无法用__try ... _来捕获它。
我想捕获这些类型的错误,因此我可以显示一个很好的错误对话框,理想情况下是一个callstack。我决定创建一个minidump,但我尝试通过在一个C ++ / CLI DLL中调用:: SetUnhandledExceptionFilter()来创建一个minidump,但这似乎不起作用。
有没有办法优雅地处理.NET应用程序中的C运行时库致命错误?
答案 0 :(得分:0)
如果您可以控制C ++代码,那么您可以安装验证处理程序,使安全字符串函数之类的东西返回错误而不是中止整个应用程序。请参阅this。
一个简单的示例显示您甚至可以将错误转换为托管异常并彻底退出:
#include <stdlib.h>
#include <string.h>
using namespace System;
void InvalidParameterHandler(
const wchar_t * expression,
const wchar_t * function,
const wchar_t * file,
unsigned int line,
uintptr_t pReserved
)
{
throw gcnew Exception("Argh");
}
int main(array <System::String ^> ^args)
{
_set_invalid_parameter_handler(InvalidParameterHandler);
try
{
wchar_t buf[1];
wcscpy_s(buf, 1, L"Hello");
}
catch(Exception^ e)
{
Console::WriteLine(e->ToString());
}
return 0;
}