CA1400 : Des points d'entrée P/Invoke doivent exister

Élément Valeur
ID de la règle CA1400
Category Microsoft.Interoperability
Modification avec rupture Sans rupture

Cause

Une méthode publique ou protégée est marquée avec le System.Runtime.InteropServices.DllImportAttribute. La bibliothèque non managée n'a pas pu être localisée, ou la méthode n'a pu être mise en correspondance avec aucune fonction de la bibliothèque. Si la règle ne parvient pas à trouver le nom de la méthode exactement comme il est spécifié, elle recherche les versions ANSI ou à caractères larges de la méthode en suffixant le nom de la méthode par « A » ou « W ». Si aucune correspondance n’est trouvée, la règle tente de localiser une fonction en utilisant le format de nom __stdcall (_MyMethod@12, où 12 représente la longueur des arguments). Si aucune correspondance n’est trouvée et que le nom de la méthode commence par « # », la règle recherche la fonction comme référence ordinale au lieu d’une référence de nom.

Remarque

Cette règle est déconseillée. Pour plus d’informations, consultez Règles dépréciées.

Description de la règle

Aucune vérification au moment de la compilation n’est disponible pour s’assurer que les méthodes marquées avec DllImportAttribute se trouvent dans la DLL non managée référencée. Si aucune fonction ayant le nom spécifié ne se trouve dans la bibliothèque ou si les arguments de la méthode ne correspondent pas aux arguments de fonction, le Common Language Runtime lève une exception.

Comment corriger les violations

Pour remédier à une violation de cette règle, corrigez la méthode qui a l’attribut DllImportAttribute. Assurez-vous que la bibliothèque non managée existe et se trouve dans le même répertoire que l’assembly qui contient la méthode. Si la bibliothèque est présente et correctement référencée, vérifiez que le nom de la méthode, le type de retour et la signature de l’argument correspondent à la fonction de bibliothèque.

Quand supprimer les avertissements

Ne supprimez pas l’avertissement de cette règle lorsque la bibliothèque non managée se trouve dans le même répertoire que l’assembly managé qui la référence. Il peut être prudent de supprimer un avertissement de cette règle dans le cas où la bibliothèque non managée n’a pas pu être localisée.

Exemple

L’exemple suivant montre un type qui enfreint la règle. Aucune fonction nommée DoSomethingUnmanaged ne s’exécute dans kernel32.dll.

using System.Runtime.InteropServices;

namespace InteroperabilityLibrary
{
   public class NativeMethods
   {
      // If DoSomethingUnmanaged does not exist, or has 
      // a different signature or return type, the following 
      // code violates rule PInvokeEntryPointsShouldExist.
      [DllImport("kernel32.dll")]
      public static extern void DoSomethingUnmanaged();
   }
}

Voir aussi

System.Runtime.InteropServices.DllImportAttribute