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);
}
}
}
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 zařazování pro argumenty řetězce volání nespravovaného kódu
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro