Pourquoi AccessViolationException ne peut pas être pris par .NET4.0
Il est vraiment intéressant de noter que le code C# suivant se crash sur .NET4.0 mais bon sur .NET2.0.
De code C#
class Program
{
static void Main(string[] args)
{
try
{
ExceptionTest();
Console.WriteLine("Done!");
}
catch (Exception e)
{
Console.WriteLine("Error !!!");
Console.WriteLine(e.Message);
}
}
[DllImport("badapp")]
private static extern int ExceptionTest();
}
Code C++
extern "C" __declspec(dllexport) int ExceptionTest()
{
IUnknown* pUnk = NULL;
pUnk->AddRef();
return 0;
}
Si la compilation ci-dessus le code C# contre .NET2.0, tout fonctionne bien. Seulement de compiler contre .NET4.0 il crash au moment de l'exécution.
Je suis soupçonner une exception système de cliquet a été changé depuis .NET4.0. Des idées?
Vous devez vous connecter pour publier un commentaire.
Oui, il a changé en .NET 4. Vous ne pouvez pas intercepter des exceptions qui indiquent un état corrompu. C'est parce qu'il y a à peu près pas de garantie que vous pouvez faire quoi que ce soit quand un état corrompu exception est levée. Il n'y a pratiquement aucune raison de vouloir un processus de corruption de l'etat à poursuivre l'exécution.
Pour la compatibilité avec les anciens de code, vous pouvez modifier ce comportement en ajoutant le
legacyCorruptedStateExceptionsPolicy
élément d'application.config.Vous pouvez aussi le faire au cas par cas par des méthodes de marquage où vous voulez attraper ces exceptions avec la HandleProcessCorruptedStateExceptions attribut.