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