Udostępnij za pośrednictwem


CA1901: Deklaracje P/Invoke powinien być przenośne

TypeName

PInvokeDeclarationsShouldBePortable

CheckId

CA1901

Kategoria

Microsoft.Portability

Zmiana kluczowa

Kluczowa - Jeśli P/Invoke jest widoczny na zewnątrz zestawu.Niekluczowa - Jeśli P/Invoke nie jest widoczny poza zestawem.

Przyczyna

Reguła ta oszacowuje wielkość każdego parametru i wartości zwracanej P/Invoke, a także weryfikuje czy wielkość skierowana do niezarządzanego kodu na 32 lub 64 bitowej platformie jest poprawna.Najczęstszym naruszeniem tej zasady jest przekazanie liczby całkowitej o stałym rozmiarze, gdy wymagana jest zmienna, o rozmiarze wskaźnika, zależna od platformy.

Opis reguły

W każdym z następujących scenariuszy występuje naruszenie tej reguły:

  • Zwracana wartość lub parametr jest podana jako liczba całkowita o stałym rozmiarze, podczas gdy powinna być wpisana jako IntPtr.

  • Zwracana wartość lub parametr jest podana jako IntPtr, podczas gdy powinna być wpisana jako liczba całkowita o stałym rozmiarze.

Jak naprawić naruszenia

Naruszenie to można naprawić przez reprezentowanie uchwytu jako IntPtr lub UIntPtr zamiast Int32 lub UInt32.

Kiedy pominąć ostrzeżenia

Nie należy pomijać tego ostrzeżenia.

Przykład

Poniższy przykład demonstruje naruszenie tej zasady.

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

W tym przykładzie parametr nIconIndex jest zadeklarowany jako IntPtr, który jest szeroki na 4 bajty na platformie 32-bitowej i 8 bajtów na platformie 64-bitowej. W poniższej deklaracji niezarządzanej, można zobaczyć, że nIconIndex jest w bajtową liczbą całkowitą bez znaku na wszystkich platformach.

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

Aby usunąć naruszenie, należy zmienić deklaracje na następujące:

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

Zobacz też

Inne zasoby

Ostrzeżenia przenośność