CA1901: Declarações P/Invoke devem ser portátil
TypeName |
PInvokeDeclarationsShouldBePortable |
CheckId |
CA1901 |
<strong>Categoria</strong> |
Microsoft.Portability |
Alteração significativa |
Dividindo - 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 de onde é necessária uma variável dependente de plataforma, o tamanho do ponteiro.
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 deve ser digitado como um IntPtr.
O parâmetro ou valor de retorno é digitado como uma IntPtr quando deve ser digitado 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. A 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);
}