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
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour