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);
}
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per