CA1901: Deklaracje P/Invoke powinny być przenośne
Pozycja | Wartość |
---|---|
Ruleid | CA1901 |
Kategoria | Microsoft.Portability |
Zmiana powodująca niezgodność | Niezgodność — jeśli element P/Invoke jest widoczny poza zestawem. Niezgodność — jeśli P/Invoke nie jest widoczny poza zestawem. |
Przyczyna
Ta reguła oblicza rozmiar każdego parametru i zwracaną wartość P/Invoke i sprawdza, czy ich rozmiar, po przesłaniu do niezarządzanego kodu na platformach 32-bitowych i 64-bitowych, jest poprawny. Najczęstszym naruszeniem tej reguły jest przekazanie stałej liczby całkowitej, w której wymagana jest zmienna o rozmiarze wskaźnika zależna od platformy.
Opis reguły
Jeden z następujących scenariuszy narusza tę regułę:
Zwracana wartość lub parametr jest typowana jako liczba całkowita o stałym rozmiarze, gdy powinna być wpisana jako
IntPtr
.Zwracana wartość lub parametr jest typowana jako
IntPtr
wartość, gdy powinna być wpisywana jako liczba całkowita o stałym rozmiarze.
Jak naprawić naruszenia
To naruszenie można naprawić za pomocą polecenia IntPtr
lub UIntPtr
do reprezentowania dojść zamiast Int32
lub UInt32
.
Kiedy pomijać ostrzeżenia
Nie należy pomijać tego ostrzeżenia.
Przykład
W poniższym przykładzie pokazano naruszenie tej reguły.
internal class NativeMethods
{
[DllImport("shell32.dll", CharSet=CharSet.Auto)]
internal static extern IntPtr ExtractIcon(IntPtr hInst,
string lpszExeFileName, IntPtr nIconIndex);
}
W tym przykładzie nIconIndex
parametr jest zadeklarowany jako IntPtr
parametr , który ma szerokość 4 bajtów na 32-bitowej platformie i 8 bajtów szerokości na platformie 64-bitowej. W poniższej deklaracji niezarządzanej widać, że nIconIndex
jest to liczba całkowita bez znaku 4 bajtów na wszystkich platformach.
HICON ExtractIcon(HINSTANCE hInst, LPCTSTR lpszExeFileName,
UINT nIconIndex);
Aby naprawić naruszenie, zmień deklarację na następującą:
internal class NativeMethods{
[DllImport("shell32.dll", CharSet=CharSet.Auto)]
internal static extern IntPtr ExtractIcon(IntPtr hInst,
string lpszExeFileName, uint nIconIndex);
}
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla