Condividi tramite


CA1901: Le dichiarazioni P/Invoke devono essere portabili

Articolo Valore
ID regola CA1901
Category Microsoft.Portability
Modifica Interruzione: se il P/Invoke è visibile all'esterno dell'assembly. Non di rilievo: se il P/Invoke non è visibile all'esterno dell'assembly.

Causa

Questa regola valuta le dimensioni di ogni parametro e il valore restituito di un P/Invoke e verifica che le relative dimensioni, quando ne viene eseguito il marshalling al codice non gestito nelle piattaforme a 32 bit e a 64 bit, è corretto. La violazione più comune di questa regola consiste nel passare un intero a dimensione fissa in cui è necessaria una variabile dipendente dalla piattaforma e con dimensioni del puntatore.

Descrizione regola

Uno degli scenari seguenti viola questa regola:

  • Il valore restituito o il parametro viene tipizzato come intero a dimensione fissa quando deve essere digitato come .IntPtr

  • Il valore restituito o il parametro viene tipizzato come oggetto IntPtr quando deve essere digitato come intero a dimensione fissa.

Come correggere le violazioni

È possibile correggere questa violazione usando IntPtr o UIntPtr per rappresentare handle invece di Int32 o UInt32.

Quando eliminare gli avvisi

Non eliminare questo avviso.

Esempio

Nell'esempio seguente viene illustrata una violazione di questa regola.

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

In questo esempio, il nIconIndex parametro viene dichiarato come IntPtr, che è largo 4 byte su una piattaforma a 32 bit e 8 byte larghezza su una piattaforma a 64 bit. Nella dichiarazione non gestita seguente è possibile notare che nIconIndex è un intero senza segno a 4 byte in tutte le piattaforme.

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

Per correggere la violazione, modificare la dichiarazione come segue:

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