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