CA2205 : Utilisez des équivalents managés de l'API Win32CA2205: Use managed equivalents of Win32 API

TypeNameTypeName UseManagedEquivalentsOfWin32ApiUseManagedEquivalentsOfWin32Api
CheckIdCheckId CA2205CA2205
CategoryCategory Microsoft.UsageMicrosoft.Usage
Modification avec ruptureBreaking Change Sans ruptureNon Breaking

CauseCause

Un appel de méthode est définie et une méthode avec la fonctionnalité équivalente existe dans le .NET Framework.NET Framework bibliothèque de classes.A platform invoke method is defined and a method with the equivalent functionality exists in the .NET Framework.NET Framework class library.

Description de la règleRule Description

Un appel de méthode est utilisée pour appeler une fonction DLL non managée et est définie à l’aide de la System.Runtime.InteropServices.DllImportAttribute attribut, ou le Declare clé en Visual Basic.A platform invoke method is used to call an unmanaged DLL function and is defined using the System.Runtime.InteropServices.DllImportAttribute attribute, or the Declare keyword in Visual Basic. Une méthode non managé défini de manière incorrecte peut entraîner des exceptions runtime en raison de problèmes tels qu’une fonction incorrectement, un mappage de types de données de valeur paramètres et de retour et des spécifications de champs incorrects, tels que la convention d’appel et le caractère erronée ensemble.An incorrectly defined platform invoke method can lead to runtime exceptions because of issues such as a misnamed function, faulty mapping of parameter and return value data types, and incorrect field specifications, such as the calling convention and character set. S’il est disponible, il est généralement d’erreur plus simple et moins sujet à appeler la méthode managée équivalente à to définir et appeler la méthode non managée directement.If available, it is generally simpler and less error prone to call the equivalent managed method than to define and call the unmanaged method directly. Appel d’une plateforme invoke (méthode) peut également entraîner des problèmes de sécurité supplémentaires qui doivent être résolus.Calling a platform invoke method can also lead to additional security issues that need to be addressed.

Comment corriger les violationsHow to Fix Violations

Pour corriger une violation de cette règle, remplacez l’appel à la fonction non managée avec un appel à son équivalent managé.To fix a violation of this rule, replace the call to the unmanaged function with a call to its managed equivalent.

Quand supprimer les avertissementsWhen to Suppress Warnings

Supprimer un avertissement de cette règle si la méthode de remplacement suggérée ne fournit pas les fonctionnalités nécessaires.Suppress a warning from this rule if the suggested replacement method does not provide the needed functionality.

ExempleExample

L’exemple suivant montre une plateforme appeler la définition de méthode qui enfreint la règle.The following example shows a platform invoke method definition that violates the rule. En outre, les appels à la plate-forme appeler la méthode et la méthode managée équivalente sont affichés.In addition, the calls to the platform invoke method and the equivalent managed method are shown.

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);
      }
   }
}
Imports System
Imports System.Runtime.InteropServices
Imports System.Text

Namespace UsageLibrary

   Class NativeMethods

      Private Sub New()
      End Sub

      ' The following method definitions violate the rule.

      <DllImport("kernel32.dll", CharSet := CharSet.Unicode, _ 
         SetLastError := True)> _ 
      Friend Shared Function ExpandEnvironmentStrings _ 
         (lpSrc As String, lpDst As StringBuilder, nSize As Integer) _ 
         As Integer
      End Function

      Friend Declare Unicode Function ExpandEnvironmentStrings2 _ 
         Lib "kernel32.dll" Alias "ExpandEnvironmentStrings" _ 
         (lpSrc As String, lpDst As StringBuilder, nSize As Integer) _ 
         As Integer

   End Class

   Public Class UseNativeMethod

      Shared Sub Main()
      
         Dim environmentVariable As String = "%TEMP%"
         Dim expandedVariable As New StringBuilder(100)

         ' Call the unmanaged method.
         NativeMethods.ExpandEnvironmentStrings( _ 
            environmentVariable, _ 
            expandedVariable, _ 
            expandedVariable.Capacity)

         ' Call the unmanaged method.
         NativeMethods.ExpandEnvironmentStrings2( _ 
            environmentVariable, _ 
            expandedVariable, _ 
            expandedVariable.Capacity)

         ' Call the equivalent managed method.
         Environment.ExpandEnvironmentVariables(environmentVariable)

      End Sub

   End Class

End Namespace

CA1404 : Appeler GetLastError immédiatement après P/InvokeCA1404: Call GetLastError immediately after P/Invoke

CA1060 : Déplacer P/Invoke vers une classe NativeMethodsCA1060: Move P/Invokes to NativeMethods class

CA1400 : Des points d’entrée P/Invoke doivent exister.CA1400: P/Invoke entry points should exist

CA1401 : Les P/Invoke ne doivent pas être visibleCA1401: P/Invokes should not be visible

CA2101 : Spécifiez le marshaling pour les arguments de chaîne P/InvokeCA2101: Specify marshaling for P/Invoke string arguments