2010-01-05 4 views
0

У меня есть проект, который состоит из приложения C#, которое вызывает пару C++/CLI DLL. Если у меня есть фатальная ошибка Visual Studio C Runtime Library в собственном коде, похоже, нет способа ее поймать.Поймать C Runtime Library fatal error in (mixed) .NET code?

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

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

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

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

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

ответ

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; 
}