Partager via


Les déclarations P/Invoke doivent être portables

Mise à jour : novembre 2007

TypeName

PInvokeDeclarationsShouldBePortable

CheckId

CA1901

Catégorie

Microsoft.Portability

Modification avec rupture

Avec rupture - Si le P/Invoke est visible à l'extérieur de l'assembly. Sans rupture - Si le P/Invoke n'est pas visible à l'extérieur de l'assembly.

Cause

Cette règle évalue la taille de chaque paramètre et la valeur de retour d'un P/Invoke, et vérifie que leur taille est correcte lorsqu'elle est marshalée au code non managé sur les plateformes 32 bits et 64 bits. La violation la plus courante de cette règle consiste à passer un entier de taille fixe lorsqu'une variable de la taille d'un pointeur dépendant de la plateforme est requise.

Description de la règle

Cette règle se déclenche dans l'un des scénarios suivants :

  • La valeur ou le paramètre renvoyé est saisi comme un entier de taille fixe lorsqu'il doit être tapé comme un IntPtr.

  • La valeur ou le paramètre renvoyé est saisi comme un IntPtr lorsqu'il doit être tapé comme un entier de taille fixe.

Comment corriger les violations

Vous pouvez corriger cette violation en utilisant IntPtr ou UIntPtr pour représenter des handles au lieu de Int32 ou UInt32.

Quand supprimer les avertissements

Vous ne devez pas supprimer cet avertissement.

Exemple

L'exemple suivant indique une violation de cette règle.

internal class NativeMethods
{
    [DllImport("shell32.dll", CharSet=CharSet.Auto)]
    internal static extern IntPtr ExtractIcon(IntPtr hInst, 
        string lpszExeFileName, IntPtr nIconIndex);
}

Dans cet exemple, le paramètre nIconIndex est déclaré comme un IntPtr, d'une largeur de 4 octets sur les plateformes 32 bits et de 8 octets sur les plateformes 64 bits. Dans la déclaration non managée qui suit, vous pouvez constater que nIconIndex est un entier non signé de 4 octets sur toutes les plateformes.

HICON ExtractIcon(HINSTANCE hInst, LPCTSTR lpszExeFileName, 
    UINT nIconIndex);

Pour résoudre la violation, modifiez la déclaration comme suit :

internal class NativeMethods{
    [DllImport("shell32.dll", CharSet=CharSet.Auto)] 
    internal static extern IntPtr ExtractIcon(IntPtr hInst, 
        string lpszExeFileName, uint nIconIndex);
}

Voir aussi

Autres ressources

Avertissements de portabilité