CA1901: as declarações de P/Invoke devem ser portáteis
TypeName |
PInvokeDeclarationsShouldBePortable |
CheckId |
CA1901 |
Categoria |
Microsoft.Portability |
Alteração Significativa |
Interromper - se o P/Invoke é visível fora do assembly.Interrompendo não - se o P/Invoke não é 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 verifique se seu tamanho, quando marshaling para código não gerenciado em plataformas de 32 bits e de 64 bits, está correto.A violação mais comuns dessa regra é transmitir um inteiro fixa dimensionado onde um plataforma dependente, variável ponteiro- dimensionado é necessário.
Descrição da Regra
Qualquer um dos seguintes cenários violar esta regra ocorre:
O valor de retorno ou o parâmetro são digitados como um inteiro de tamanho fixo quando deve ser digitado como IntPtr.
O valor de retorno ou o parâmetro são digitados como IntPtr quando devem ser digitados como um inteiro de tamanho fixo.
Como Corrigir Violações
Você pode corrigir essa violação usando IntPtr ou UIntPtr para representar os identificadores em vez de Int32 ou de UInt32.
Quando Suprimir Alertas
Você não deve eliminar 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 parâmetro de nIconIndex é declarado como IntPtr, que é de 4 bytes de comprimento em uma plataforma de 32 bits e 8 bytes de comprimento em uma plataforma de 64 bits.Na declaração não gerenciados de forma, você pode ver que nIconIndex é um número inteiro sem sinal de 4 bytes em todas as plataformas.
HICON ExtractIcon(HINSTANCE hInst, LPCTSTR lpszExeFileName,
UINT nIconIndex);
Para corrigir a violação, altere a declaração ao seguinte:
internal class NativeMethods{
[DllImport("shell32.dll", CharSet=CharSet.Auto)]
internal static extern IntPtr ExtractIcon(IntPtr hInst,
string lpszExeFileName, uint nIconIndex);
}