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