CA2205 : Utilisez des équivalents managés de l'API Win32
Élément | Valeur |
---|---|
ID de la règle | CA2205 |
Category | Microsoft.Usage |
Modification avec rupture | Sans rupture |
Cause
Une méthode PInvoke est définie et une méthode avec la fonctionnalité équivalente existe dans .NET.
Description de la règle
Une méthode PInvoke est utilisée pour appeler une fonction de DLL non managée et est définie à l’aide de l’attribut System.Runtime.InteropServices.DllImportAttribute ou du mot clé Declare
en Visual Basic. Une méthode PInvoke incorrectement définie peut entraîner des exceptions à l’exécution en raison de différents problèmes : fonction mal nommée, mauvais mappage des types de données de paramètre et de valeur de retour, spécifications de champ incorrectes (convention d’appel ou jeu de caractères, par exemple), etc. Dans la mesure du possible, au lieu de définir et d’appeler directement une méthode non managée, appelez la méthode managée équivalente. Vous gagnerez en simplicité et réduirez le risque d’erreur. L’appel d’une méthode PInvoke peut également entraîner des problèmes de sécurité supplémentaires, qu’il vous faudra résoudre.
Comment corriger les violations
Pour corriger une violation de cette règle, remplacez l’appel à la fonction non managée par un appel à son équivalent managé.
Quand supprimer les avertissements
Supprimez un avertissement de cette règle si la méthode de remplacement suggérée ne fournit pas les fonctionnalités nécessaires.
Exemple
L’exemple suivant montre une définition de méthode PInvoke qui enfreint la règle. Il montre également les appels à la méthode PInvoke et à la méthode managée équivalente.
using System;
using System.Runtime.InteropServices;
using System.Text;
namespace UsageLibrary
{
internal class NativeMethods
{
private NativeMethods() {}
// The following method definition violates the rule.
[DllImport("kernel32.dll", CharSet = CharSet.Unicode,
SetLastError = true)]
internal static extern int ExpandEnvironmentStrings(
string lpSrc, StringBuilder lpDst, int nSize);
}
public class UseNativeMethod
{
public void Test()
{
string environmentVariable = "%TEMP%";
StringBuilder expandedVariable = new StringBuilder(100);
// Call the unmanaged method.
NativeMethods.ExpandEnvironmentStrings(
environmentVariable,
expandedVariable,
expandedVariable.Capacity);
// Call the equivalent managed method.
Environment.ExpandEnvironmentVariables(environmentVariable);
}
}
}
Règles associées
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