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