在(混合).NET 代码中捕获 C 运行时库致命错误?

发布于 2024-08-16 20:56:28 字数 431 浏览 4 评论 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 运行时库致命错误?

I have a project that consists of a C# application that calls into a couple of C++/CLI DLLs. If I have a Visual Studio C Runtime Library fatal error in the native code, there appears to be no way to catch it.

To give a simple example, if I put this in the native code:

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

The app will crash (in release builds). It doesn't throw an exception and I can't catch it with __try...__except.

I'd like to catch these kinds of errors so I can display a nice error dialog, ideally with a callstack. I'd settle for creating a minidump, but I tried creating a minidump by calling ::SetUnhandledExceptionFilter() in one of the C++/CLI DLLs but that doesn't appear to work either.

Is there any way to gracefully handle a C Runtime Library fatal error in a .NET application?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你穿错了嫁妆 2024-08-23 20:56:29

如果您可以控制 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;
}

If you have control of the C++ code then you can install a validation handler to make things like the safe string functions return an error rather than aborting the entire applicaiton. See this.

A simple example showing you can even convert the error to a managed exception and exit cleanly:

#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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文