CA1400: Deben existir puntos de entrada P/Invoke

Elemento Valor
RuleId CA1400
Category Microsoft.Interoperability
Cambio importante Poco problemático

Causa

Un método público o protegido se marca con el atributo System.Runtime.InteropServices.DllImportAttribute. No se pudo encontrar la biblioteca no administrada o el método no coincide con una función de la biblioteca. Si la regla no encuentra el nombre exacto del método tal como se ha especificado, buscará versiones ANSI o de caracteres anchos del método mediante la adición del sufijo"A" o "W" al nombre del método. Si no se encuentra ninguna coincidencia, la regla intenta buscar una función mediante el formato de nombre __stdcall (_MyMethod@12, donde 12 representa la longitud de los argumentos). Si no se encuentra ninguna coincidencia y el nombre del método comienza por "#", la regla busca la función como una referencia ordinal en lugar de una referencia de nombre.

Nota

Esta regla está en desuso. Para más información, consulte Reglas en desuso.

Descripción de la regla

No hay ninguna comprobación en tiempo de compilación disponible para asegurarse de que los métodos marcados con DllImportAttribute se encuentran en el DLL no administrado al que se hace referencia. Si no hay ninguna función que tenga el nombre especificado en la biblioteca o los argumentos del método no coinciden con los argumentos de la función, Common Language Runtime producirá una excepción.

Cómo corregir infracciones

Para corregir una infracción de esta regla, corrija el método que tiene el atributo DllImportAttribute. Asegúrese de que la biblioteca no administrada existe y está en el mismo directorio que el ensamblado que contiene el método. Si la biblioteca está presente y se hace referencia a ella correctamente, compruebe que el nombre del método, el tipo de valor devuelto y la signatura del argumento coinciden con la función de la biblioteca.

Cuándo suprimir las advertencias

No suprima una advertencia de esta regla si la biblioteca no administrada se encuentra en el mismo directorio que el ensamblado administrado que hace referencia a ella. Es posible que sea seguro suprimir una advertencia de esta regla en caso de que no se pueda encontrar la biblioteca no administrada.

Ejemplo

En el ejemplo siguiente se muestra un tipo que infringe la regla. No se produce ninguna función con nombre DoSomethingUnmanaged en kernel32.dll.

using System.Runtime.InteropServices;

namespace InteroperabilityLibrary
{
   public class NativeMethods
   {
      // If DoSomethingUnmanaged does not exist, or has 
      // a different signature or return type, the following 
      // code violates rule PInvokeEntryPointsShouldExist.
      [DllImport("kernel32.dll")]
      public static extern void DoSomethingUnmanaged();
   }
}

Consulte también

System.Runtime.InteropServices.DllImportAttribute