Deklarationen von P/Invoke müssen portabel sein

Aktualisiert: November 2007

     TypeName

PInvokeDeclarationsShouldBePortable

CheckId

CA1901

Kategorie

Microsoft.Portability

Unterbrechende Änderung

Unterbrechend – Wenn P/Invoke außerhalb der Assembly sichtbar ist. Nicht unterbrechend – Wenn P/Invoke außerhalb der Assembly nicht 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

Diese Regel löst bei einem der beiden folgenden Szenarien eine Warnung aus:

  • 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.

Behandlung 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 wurde der nIconIndex-Parameter als IntPtr deklariert, der auf 32-Bit-Plattformen eine Breite von 4 und auf 64-Bit-Plattformen eine Breite von 8 Bytes aufweist. Aus der folgenden Deklaration in nicht verwaltetem Code ist ersichtlich, dass nIconIndex auf allen Plattformen einer 4-Byte-Ganzzahl ohne Vorzeichen entspricht.

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