Udostępnij za pośrednictwem


CA2205: Użyj zarządzanych odpowiedników interfejsu API Win32

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 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: Należy wywołać GetLastError natychmiast po P/Invoke

CA1060: Przenieś P/Invokes do klasy NativeMethods

CA1400: Powinny istnieć punkty wejścia P/Invoke

CA1401: P/Invokes nie powinny być widoczne

CA2101: Należy określić operacje organizacyjne dla argumentów typu string P/Invoke