Udostępnij za pośrednictwem


CA2205: Użyj zarządzane odpowiedniki interfejsu Win32 API

TypeName

UseManagedEquivalentsOfWin32Api

CheckId

CA2205

Kategoria

Microsoft.Usage

Zmiana kluczowa

Niekluczowa

Przyczyna

Metoda wywołania platformy jest zdefiniowana a istnieje metoda z równoważną funkcjonalnością w bibliotece klas .NET Framework.

Opis reguły

Metoda wywołania platformy jest używana do wywoływania niezarządzanej funkcji DLL i jest definiowana za pomocą atrybutu System.Runtime.InteropServices.DllImportAttribute, lub słowa kluczowego Declare w języku Visual Basic.Niepoprawnie zdefiniowana metoda wywołania platformy może prowadzić do wyjątków w czasie wykonania, ze względu na niepoprawnie nazwaną funkcję, błędne mapowanie parametru i typu danych zwracanej wartości, i nieprawidłową specyfikację pola, taką jak wywołanie konwencji i zestawu znaków.Jeśli to możliwe, na ogół jest prostsze i mniej podatne na błędy wywołanie równoważnej metody zarządzanej niż bezpośrednie definiowanie i wywoływanie metody niezarządzanej.Wywoływanie metody wywołania platformy może również prowadzić do dodatkowych problemów bezpieczeństwa, którymi trzeba się zająć.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, zastąp wywołanie funkcji niezarządzanej, wywołaniem jej zarządzanego odpowiednika.

Kiedy pominąć ostrzeżenia

Ostrzeżenie od tej reguły można pominąć, jeśli sugerowana metoda zastąpienia nie zapewnia potrzebnych funkcji.

Przykład

W poniższym przykładzie pokazano definicję metody wywołania platformy, która narusza regułę.Ponadto pokazano wywołanie metody wywołania platformy i odpowiednik metody zarządzanej.

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

Powiązane reguły

CA1404: Wywołać GetLastError, niezwłocznie po wywołać/P

CA1060: Przenoszenie P/Invokes do klasy NativeMethods

CA1400: Punkty wejścia P/Invoke powinien istnieć.

CA1401: P/Invokes nie powinny być widoczne

CA2101: Określ kierowanie dla argumentów typu string P/Invoke.