Freigeben über


CA1901: Deklarationen von P/Invoke müssen portabel sein

TypeName

PInvokeDeclarationsShouldBePortable

CheckId

CA1901

Kategorie

Microsoft.Portability

Unterbrechende Änderung

Unterbrechend – Wenn das P/Invoke außerhalb der Assembly sichtbar ist. Nicht unterbrechend – Wenn P/Invoke nicht außerhalb der Assembly sichtbar ist.

Ursache

Diese Regel wertet die Größe der einzelnen Parameter und den Rückgabewert einer P/Invoke-Deklaration aus und überprüft, ob die zugehörige Größe beim Marshallen an nicht verwalteten Code auf einer 32-Bit- oder 64-Bit-Plattform richtig ist. Der am häufigsten auftretende Verstoß gegen diese Regel ist die Übergabe einer ganz Zahl fester Größe, wenn eine plattformabhängige Variable in Zeigergröße erforderlich ist.

Regelbeschreibung

Wenn eines der folgenden Szenarien gegen die Regel verstößt, tritt diese Regel auf:

  • Der Rückgabewert oder Parametertyp wurde als Ganzzahl fester Größe anstatt als IntPtr typisiert.

  • Der Rückgabewert oder Parametertyp wurde als IntPtr anstatt als Ganzzahl fester Größe typisiert.

Behandeln von Verstößen

Sie können diesen Verstoß beheben, indem Sie statt mit Int32 oder UInt32 mithilfe von IntPtr oder UIntPtr Handles darstellen.

Wann sollten Warnungen unterdrückt werden?

Diese Warnung sollte nicht unterdrückt werden.

Beispiel

Im folgenden Beispiel wird ein Verstoß gegen diese Regel veranschaulicht.

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

In diesem Beispiel wird der nIconIndex-Parameter als IntPtr deklariert, der auf einer 32-Bit-Plattform 4 Byte und auf einer 64-Bit-Plattform 8 Byte lang ist. In der folgenden nicht verwalteten Deklaration können Sie sehen, dass nIconIndex auf allen Plattformen eine 4-Byte-Ganzzahl ohne Vorzeichen ist.

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

Um den Verstoß zu beheben, ändern Sie die Deklaration wie folgt:

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

Siehe auch

Weitere Ressourcen

Portabilitätswarnungen