Compartir a través de


CA1901: Las declaraciones P/Invoke deben ser portátiles

Nombre de tipo

PInvokeDeclarationsShouldBePortable

Identificador de comprobación

CA1901

Categoría

Microsoft.Portability

Cambio problemático

Problemático: si P/Invoke es visible fuera del ensamblado.No problemático: si el método P/Invoke no es visible fuera del ensamblado.

Motivo

Esta regla evalúa el tamaño de cada parámetro y el valor devuelto de P/Invoke, y comprueba que su tamaño sea correcto al calcular las referencias para su conversión al código no administrado en plataformas de 32 y 64 bits.La infracción más común de esta regla consiste en pasar un entero de tamaño fijo cuando se necesita una variable dimensionada por puntero dependiente de la plataforma.

Descripción de la regla

Cualquiera de los siguientes escenarios que infringe esta regla se produce:

  • El tipo de valor devuelto o parámetro es un entero de tamaño fijo cuando debería ser IntPtr.

  • El tipo de valor devuelto o parámetro es IntPtr cuando debería ser un entero de tamaño fijo.

Cómo corregir infracciones

Puede corregir esta infracción utilizando IntPtr o UIntPtr para representar los identificadores en lugar de Int32 o UInt32.

Cuándo suprimir advertencias

Esta advertencia no se debe suprimir.

Ejemplo

En el ejemplo siguiente se muestra una infracción de esta regla.

internal class NativeMethods
{
    [DllImport("shell32.dll", CharSet=CharSet.Auto)]
    internal static extern IntPtr ExtractIcon(IntPtr hInst, 
        string lpszExeFileName, IntPtr nIconIndex);
}

En este ejemplo, el parámetro nIconIndex se declara como IntPtr, que tiene un ancho de 4 bytes en una plataforma de 32 bits y un ancho de 8 bytes en una plataforma de 64 bits. En la declaración no administrada que sigue, se puede ver que nIconIndex es un entero sin signo de 4 bytes en todas las plataformas.

HICON ExtractIcon(HINSTANCE hInst, LPCTSTR lpszExeFileName, 
    UINT nIconIndex);

Para corregir la infracción, cambie la declaración de la siguiente manera:

internal class NativeMethods{
    [DllImport("shell32.dll", CharSet=CharSet.Auto)] 
    internal static extern IntPtr ExtractIcon(IntPtr hInst, 
        string lpszExeFileName, uint nIconIndex);
}

Vea también

Otros recursos

Advertencias de portabilidad