C# Language Traitement des erreurs Win32


Exemple

Lorsque vous utilisez des méthodes d'interopérabilité, vous pouvez utiliser l'API GetLastError pour obtenir des informations supplémentaires sur vos appels d'API.

Attribut DllImport Attribut SetLastError

SetLastError = true

Indique que l'appelé appellera SetLastError (fonction API Win32).

SetLastError = false

Indique que l'appelé n'appellera pas SetLastError (fonction API Win32), vous ne recevrez donc pas d'informations d'erreur.

  • Lorsque SetLastError n'est pas défini, il est défini sur false (valeur par défaut).

  • Vous pouvez obtenir le code d'erreur à l'aide de la méthode Marshal.GetLastWin32Error:

Exemple:

[DllImport("kernel32.dll", SetLastError=true)]
public static extern IntPtr OpenMutex(uint access, bool handle, string lpName);

Si vous essayez d'ouvrir mutex qui n'existe pas, GetLastError retournera ERROR_FILE_NOT_FOUND .

var lastErrorCode = Marshal.GetLastWin32Error();

if (lastErrorCode == (uint)ERROR_FILE_NOT_FOUND)
{
    //Deal with error         
}

Les codes d'erreur du système peuvent être trouvés ici:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx

API GetLastError

Il existe une API GetLastError native que vous pouvez également utiliser:

[DllImport("coredll.dll", SetLastError=true)]
static extern Int32 GetLastError();
  • Lorsque vous appelez l'API Win32 à partir du code managé, vous devez toujours utiliser l' erreur Marshal.GetLastWin32Error .

Voici pourquoi:

Entre votre appel Win32 qui définit l'erreur (appelle SetLastError), le CLR peut également appeler d'autres appels Win32 pouvant appeler SetLastError , ce comportement peut remplacer votre valeur d'erreur. Dans ce scénario, si vous appelez GetLastError, vous pouvez obtenir une erreur non valide.

Si vous définissez SetLastError = true , le CLR récupère le code d'erreur avant d'exécuter d'autres appels Win32.