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

Zboží Hodnota
RuleId CA2205
Kategorie Microsoft.Usage
Změna způsobující chybu Nenarušující

Příčina

Metoda vyvolání platformy je definována a metoda s ekvivalentními funkcemi existuje v .NET.

Popis pravidla

Metoda vyvolání platformy se používá k volání nespravované funkce knihovny DLL a je definována pomocí atributu System.Runtime.InteropServices.DllImportAttribute nebo klíčového Declare slova v jazyce Visual Basic. Nesprávně definovaná metoda volání platformy může vést k výjimkám za běhu kvůli problémům, jako je chybná funkce, chybné mapování datových typů parametrů a návratových hodnot a nesprávné specifikace polí, jako jsou konvence volání a znaková sada. Pokud je k dispozici, je jednodušší a méně náchylné k chybě volat ekvivalentní spravovanou metodu, než definovat a volat nespravovanou metodu přímo. Volání metody vyvolání platformy může také vést k dalším problémům se zabezpečením, které je potřeba vyřešit.

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, nahraďte volání nespravované funkce voláním jeho spravovaného ekvivalentu.

Kdy potlačit upozornění

Potlačit upozornění z tohoto pravidla, pokud navrhovaná metoda nahrazení neposkytuje potřebné funkce.

Příklad

Následující příklad ukazuje definici metody vyvolání platformy, která porušuje pravidlo. Kromě toho se zobrazí volání metody vyvolání platformy a ekvivalentní spravovaná metoda.

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