CA1901 : Les déclarations P/Invoke doivent être portables
TypeName |
PInvokeDeclarationsShouldBePortable |
CheckId |
CA1901 |
Catégorie |
Microsoft.Portability |
Modification avec rupture |
Avec rupture - Si P/Invoke est visible à l'extérieur de l'assembly. Sans rupture - Si 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
L'un des scénarios suivants viole cette règle :
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 IntPtr avec une largeur de 4 octets sur une plateforme 32 bits et de 8 octets sur une plateforme 64 bits. Dans la déclaration non managée qui suit, vous pouvez voir 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);
}