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.