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