Declarações P/Invoke devem ser portátil

TypeName

PInvokeDeclarationsShouldBePortable

CheckId

CA1901

Category (Categoria)

Microsoft.Portability

Quebrando alterar

Dividindo - se o P/Invoke é visível fora do assembly.Non quebrando - se o P/Invoke não estiver visível fora do assembly.

Causa

Essa regra é avalia o dimensionar de cada parâmetro e o valor retornado de um P/Invoke e verifica se o seu dimensionar quando empacotado para código não gerenciado em plataformas de 32 bit e 64 bit está correto.A violação mais comum dessa regra é passar um inteiro de tamanho fixo onde uma variável de ponteiro porte dependente de plataforma é necessária.

Descrição da regra

Essa regra é acionado em qualquer um dos seguintes cenários:

  • O parâmetro ou valor retornado é digitado sistema autônomo um inteiro de dimensionar fixo quando deve ser digitado sistema autônomo um IntPtr.

  • O parâmetro ou valor retornado é digitado sistema autônomo um IntPtr Quando deve ser digitado sistema autônomo um inteiro de dimensionar fixo.

Como corrigir violações

Você pode corrigir essa violação usando IntPtr ou UIntPtr para representar alças em vez de Int32 ou UInt32.

Quando suprimir avisos

Você não deverá suprimir esse aviso.

Exemplo

O exemplo a seguir demonstra uma violação desta regra.

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

Neste exemplo, a nIconIndex parâmetro é declarado sistema autônomo um IntPtr, que é de 4 byte ampla em uma plataforma de 32 bit e ampla em uma plataforma de 64 bit de 8 byte. A declaração não gerenciada que se segue, você pode ver que nIconIndex é um número inteiro sem sinal de 4 byte em todas sistema autônomo plataformas.

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

Para corrigir a violação, altere a declaração para o seguinte:

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

Consulte também

Outros recursos

Avisos de portabilidade