CA2205: Utilizar equivalentes administrados de la API Win32
Nombre de tipo |
UseManagedEquivalentsOfWin32Api |
Identificador de comprobación |
CA2205 |
Categoría |
Microsoft.Usage |
Cambio problemático |
No |
Motivo
Se define un método de invocación de plataforma y hay un método con la funcionalidad equivalente en la biblioteca de clases de .NET Framework.
Descripción de la regla
Un método de invocación de plataforma se utiliza para llamar a la función de la DLL no administrada y se define utilizando el atributo System.Runtime.InteropServices.DllImportAttribute o la palabra clave Declare en Visual Basic.Un método de invocación de plataforma definido incorrectamente puede generar excepciones en tiempo de ejecución por aspectos como una función con nombre incorrecto, una asignación defectuosa de parámetro y de tipos de datos de los valores devueltos y especificaciones de campos incorrectas, como la convención de llamada y el juego de caracteres.Si es posible, generalmente es más sencillo y produce menos errores llamar al método administrado equivalente que definir directamente la llamada al método no administrado.Llamar a un método de invocación de plataforma también puede provocar problemas de seguridad adicionales que necesitan tratarse.
Cómo corregir infracciones
Para corregir una infracción de esta regla, reemplace la llamada a la función no administrada con una llamada a su equivalente administrado.
Cuándo suprimir advertencias
Suprima una advertencia de esta regla si el método de reemplazo sugerido no proporciona la funcionalidad necesaria.
Ejemplo
El siguiente ejemplo muestra una definición de método de invocación de plataforma que infringe la regla.Además, se muestran las llamadas al método de invocación de plataforma y el método administrado equivalente.
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);
}
}
}
Reglas relacionadas
CA1404: Llame a GetLastError inmediatamente después de P/Invoke
CA1060: Mueva P/Invokes a la clase NativeMethods
CA1400: Deben existir puntos de entrada P/Invoke
CA1401: Los elementos P/Invoke no deben estar visibles
CA2101: Especifique cálculo de referencias para argumentos de cadena P/Invoke