Udostępnij za pośrednictwem


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 IntPtrparametr , 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);
}