CA2205: Utilizar equivalentes administrados de la API Win32

Elemento Valor
RuleId CA2205
Category Microsoft.Usage
Cambio importante Poco problemático

Causa

Se define un método de invocación de plataforma y existe un método con la funcionalidad equivalente en .NET.

Descripción de la regla

Un método de invocación de plataforma se usa para llamar a una función DLL no administrada y se define mediante el atributo System.Runtime.InteropServices.DllImportAttribute, o la palabra clave Declare en Visual Basic. Un método de invocación a la plataforma definido incorrectamente puede provocar excepciones en tiempo de ejecución debido a problemas como una función mal denominada, una asignación errónea de tipos de datos de parámetros y valores de retorno, y especificaciones incorrectas de los campos, como la convención de llamada y el juego de caracteres. Si está disponible, es más sencillo y menos propenso a errores llamar al método administrado equivalente que definir y llamar directamente al método no administrado. Llamar a un método de invocación de plataforma también puede dar lugar a problemas de seguridad adicionales que deben solucionarse.

Cómo corregir infracciones

Para corregir una infracción de esta regla, reemplace la llamada a la función no administrada por una llamada a su equivalente administrado.

Cuándo suprimir las advertencias

Suprima una advertencia de esta regla si el método de reemplazo sugerido no proporciona la funcionalidad necesaria.

Ejemplo

En el ejemplo siguiente se 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 al método administrado equivalente.

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);
      }
   }
}