CA1414: Boolesche P/Invoke-Argumente mit MarshalAs markieren
Element | Wert |
---|---|
RuleId | CA1414 |
Category | Microsoft.Interoperability |
Unterbrechende Änderung | Breaking |
Ursache
Die Deklaration einer Plattformaufrufmethode enthält einen System.Boolean-Parameter oder -Rückgabewert, aber das System.Runtime.InteropServices.MarshalAsAttribute-Attribut wird nicht auf den Parameter oder Rückgabewert angewendet.
Regelbeschreibung
Eine Plattformaufrufmethode greift auf nicht verwalteten Code zu und wird mithilfe des Declare
-Schlüsselworts in Visual Basic oder dem System.Runtime.InteropServices.DllImportAttribute definiert. MarshalAsAttribute gibt das Marshallingverhalten an, das zum Konvertieren von Datentypen zwischen verwaltetem und nicht verwaltetem Code verwendet wird. Viele einfache Datentypen wie System.Byte und System.Int32 verfügen über eine einzelne Darstellung in nicht verwaltetem Code und erfordern keine Angabe ihres Marshallingverhaltens. Die Common Language Runtime (CLR) implementiert automatisch das richtige Verhalten.
Der Boolean-Datentyp verfügt über mehrere Darstellungen in nicht verwaltetem Code. Wenn das MarshalAsAttribute nicht angegeben ist, ist System.Runtime.InteropServices.UnmanagedType das standardmäßige Marshallingverhalten für den Boolean-Datentyp. Dies ist eine 32-Bit-Ganzzahl, die nicht in allen Fällen geeignet ist. Die boolesche Darstellung, die für die nicht verwaltete Methode erforderlich ist, sollte bestimmt und mit dem entsprechenden System.Runtime.InteropServices.UnmanagedType abgeglichen werden. UnmanagedType.Bool ist der Win32-BOOL-Typ, der immer 4 Bytes ist. UnmanagedType.U1 sollte für bool
in C++ oder andere 1-Byte-Typen verwendet werden.
Behandeln von Verstößen
Sie können einen Verstoß gegen diese Regel beheben, indem Sie Boolean auf den MarshalAsAttribute-Parameter oder -Rückgabewert anwenden. Legen Sie den Wert des Attributs auf den entsprechenden UnmanagedType fest.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie keine Warnung dieser Regel. Selbst wenn das Standardmarshallingverhalten geeignet ist, vereinfacht die explizite Angabe des Verhaltens die Verwaltung des Codes.
Beispiel
Das folgende Beispiel zeigt Plattformaufrufmethoden, die mit den entsprechenden MarshalAsAttribute-Attributen markiert sind.
using System;
using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
namespace InteroperabilityLibrary
{
[ComVisible(true)]
internal class NativeMethods
{
private NativeMethods() {}
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern Boolean MessageBeep(UInt32 uType);
[DllImport("mscoree.dll",
CharSet = CharSet.Unicode,
SetLastError = true)]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool StrongNameSignatureVerificationEx(
[MarshalAs(UnmanagedType.LPWStr)] string wszFilePath,
[MarshalAs(UnmanagedType.U1)] bool fForceVerification,
[MarshalAs(UnmanagedType.U1)] out bool pfWasVerified);
}
}
Ähnliche Regeln
CA1901: Deklarationen von P-Invoke müssen portabel sein
CA2101: Marshalling für P-Invoke-Zeichenfolgenargumente festlegen
Siehe auch
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für