Sdílet prostřednictvím


CA2205: Použijte spravované ekvivalenty rozhraní Win32 API

TypeName

UseManagedEquivalentsOfWin32Api

CheckId

CA2205

Kategorie

Microsoft.Usage

Narušující změna

Nenarušující

Příčina

V knihovně tříd .NET Framework existuje metoda se stejnou funkcionalitou jako má definovaná metoda vyvolání platformy.

Popis pravidla

Metoda vyvolání platformy je používána pro volání nespravovaných funkcí DLL knihoven a je definována pomocí atributu DllImportAttribute, nebo v jazyce Visual Basic pomocí klíčového slova Declare.Nesprávně definovaná metoda vyvolání platformy může vézt k vyvolání výjimky modulu runtime, z důvodu chyb jako jsou: špatně pojmenovaná funkce, chybné mapování datových typů parametrů a návratových hodnot; a špatné specifikace pole, například chybná konvence volání nebo znaková sada.Jestliže je to možné, je obecně lepší a méně náchylné k chybám volat ekvivalentní spravovanou metodu, než definovat a volat nespravovanou metodu přímo.Volání metody vyvolání platformy může rovněž vést k dalším bezpečnostním problémům, na které je třeba se zaměřit.

Jak vyřešit porušení

Pro vyřešení porušení tohoto pravidla je nutné volat nespravovanou funkci voláním odpovídající spravované metody.

Kdy potlačit upozornění

Upozornění lze potlačit, jestliže navrhovaná náhradní metoda neposkytuje potřebnou funkcionalitu.

Příklad

Následující příklad ukazuje metodu vyvolání platformy, která toto pravidlo porušuje.Navíc jsou ukázána volání metody vyvolání platformy a ekvivalentní spravované metody.

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

Související pravidla

CA1404: Volejte GetLastError ihned po volání nespravovaného kódu

CA1060: Přesuňte volání nespravovaných kódů do třídy NativeMethods

CA1400: Vstupní body volání nespravovaného kódu by měly existovat

CA1401: Volání nespravovaných kódů by neměla být viditelná

CA2101: Určete kódování pro argumenty řetězce volání nespravovaného kódu