Partilhar via


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

TypeName

PInvokeDeclarationsShouldBePortable

CheckId

CA1901

<strong>Categoria</strong>

Microsoft.Portability

Alteração significativa

Quebrando - se o P/Invoke é visível fora do assembly.Não separável - se o P/Invoke não estiver visível fora do assembly.

Causa

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

Descrição da regra

Uma das seguintes situações viola essa regra ocorre:

  • O parâmetro ou valor de retorno é digitado como um inteiro de tamanho fixo quando ela deve ser digitada como uma IntPtr.

  • O parâmetro ou valor de retorno é digitado como uma IntPtr quando ela deve ser digitada como um inteiro de tamanho 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 deve 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, o nIconIndex parâmetro é declarado como um IntPtr, que é de 4 bytes de largura em uma plataforma de 32 bits e de 8 bytes de largura em uma plataforma de 64 bits. Na declaração não gerenciada que se segue, você pode ver que nIconIndex é um inteiro não assinado de 4 bytes em todas as 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