CA1400 : Des points d'entrée P/Invoke doivent exister
TypeName |
PInvokeEntryPointsShouldExist |
CheckId |
CA1400 |
Catégorie |
Microsoft.Interoperability |
Modification avec rupture |
Modification sans rupture |
Cause
Une méthode publique ou protégée est marquée avec l'attribut 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 exact de la méthode tel qu'il est spécifié, elle recherche des versions ANSI ou à caractères larges de ce nom en lui ajoutant un suffixe 'A' ou 'W.' Si aucune correspondance n'est trouvée, la règle essaie de localiser une fonction à l'aide du format de nom __stdcall (_MyMethod@12, où 12 représente la longueur des arguments). Si aucune correspondance n'est trouvée, et si le nom de la méthode commence par '#', la règle recherche la fonction en tant que référence ordinale plutôt qu'en tant que référence de nom.
Description de la règle
Aucun contrôle de compilation n'est disponible pour s'assurer que les méthodes identifiées par DllImportAttribute sont situées dans la DLL référencée non managée. Si aucune fonction qui présente le nom spécifié n'existe dans la bibliothèque, ou si les arguments appliqués à la méthode ne correspondent pas à ceux de la fonction, le Common Language Runtime lève une exception.
Comment corriger les violations
Pour corriger une violation de cette règle, corrigez la méthode qui présente l'attribut DllImportAttribute. Assurez-vous que la bibliothèque non managée existe et qu'elle se trouve bien 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 méthode, le type de retour et la signature d'argument correspondent à la fonction de la bibliothèque.
Quand supprimer les avertissements
Ne supprimez aucun avertissement de cette règle si la bibliothèque non managée se trouve dans le même répertoire que l'assembly managé qui la référence. Il est possible de supprimer sans risque un avertissement de cette règle au cas où la bibliothèque non managée ne pourrait pas être localisée.
Exemple
L'exemple suivant présente un type qui enfreint la règle. Aucune fonction nommée DoSomethingUnmanaged ne se produit 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();
}
}