Compartir a través de


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