2010-01-05 13 views
0

J'ai un projet qui consiste en une application C# qui appelle dans un couple de DLL C++/CLI. Si j'ai une erreur fatale Visual Studio C Runtime Library dans le code natif, il semble y avoir aucun moyen de l'attraper.Catch une erreur fatale C Runtime Library dans le code (mixte) .NET?

Pour donner un exemple simple, si je mets cela dans le code natif:

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

L'application se bloque (dans la version builds). Il ne lance pas d'exception et je ne peux pas l'attraper avec __try ...__ sauf.

Je voudrais attraper ces types d'erreurs afin que je puisse afficher une belle boîte de dialogue d'erreur, idéalement avec un callstack. Je me contenterais de créer un minidump, mais j'ai essayé de créer un minidump en appelant :: SetUnhandledExceptionFilter() dans l'une des DLL C++/CLI mais cela ne semble pas fonctionner non plus.

Existe-t-il un moyen de gérer de manière gracieuse une erreur fatale de la bibliothèque C Runtime dans une application .NET?

Répondre

0

Si vous contrôlez le code C++, vous pouvez installer un gestionnaire de validation pour que des fonctions telles que les fonctions de chaîne sécurisée renvoient une erreur plutôt que d'abandonner l'intégralité de l'application. Voir this.

Un exemple simple vous montrant peut même convertir l'erreur à une exception gérée et la sortie proprement:

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