Freigeben über


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

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

CA2101: Marshalling für P-Invoke-Zeichenfolgenargumente festlegen

Siehe auch