0

我有一个项目,它包含一个调用几个 C++/CLI DLL 的 C# 应用程序。如果我在本机代码中有 Visual Studio C 运行时库致命错误,似乎无法捕捉到它。

举一个简单的例子,如果我把它放在本机代码中:

    wchar_t buf[1];
    ::wcscpy_s(buf, 1, L"ab");

该应用程序将崩溃(在发布版本中)。它不会抛出异常,我无法用 __try...__except 捕获它。

我想捕捉这些类型的错误,这样我就可以显示一个很好的错误对话框,最好是使用调用堆栈。我愿意创建一个小型转储,但我尝试通过在其中一个 C++/CLI DLL 中调用 ::SetUnhandledExceptionFilter() 来创建一个小型转储,但这似乎也不起作用。

有什么方法可以优雅地处理 .NET 应用程序中的 C 运行时库致命错误?

4

1 回答 1

0

如果您可以控制 C++ 代码,那么您可以安装验证处理程序以使安全字符串函数之类的内容返回错误,而不是中止整个应用程序。看到这个

一个简单的示例显示您甚至可以将错误转换为托管异常并干净地退出:

#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;
}
于 2010-01-05T18:10:20.510 回答