Поймать фатальную ошибку библиотеки времени выполнения C в (смешанном) коде .NET? - PullRequest
0 голосов
/ 05 января 2010

У меня есть проект, который состоит из приложения C #, которое вызывает пару библиотек C ++ / CLI. Если у меня в исходном коде есть фатальная ошибка Visual Studio C Runtime Library, похоже, нет способа ее отловить.

Чтобы привести простой пример, если я добавлю это в нативный код:

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

Приложение будет зависать (в сборках релиза). Это не исключение, и я не могу поймать его с помощью __try ...__ кроме.

Я бы хотел отлавливать ошибки такого рода, чтобы я мог отобразить хороший диалог об ошибках, в идеале с помощью стека вызовов. Я бы согласился на создание мини-дамп, но я попытался создать мини-дамп, вызвав :: SetUnhandledExceptionFilter () в одной из библиотек C ++ / CLI, но это тоже не работает.

Есть ли способ изящно обработать фатальную ошибку библиотеки времени выполнения C в приложении .NET?

1 Ответ

0 голосов
/ 05 января 2010

Если у вас есть контроль над кодом 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;
}
...