Udostępnij za pośrednictwem


CA1414: Znak boolean P/Invoke argumenty z MarshalAs

TypeName

MarkBooleanPInvokeArgumentsWithMarshalAs

CheckId

CA1414

Kategoria

Microsoft.Interoperability

Zmiana kluczowa

Kluczowa

Przyczyna

Deklaracja metody wywołania platformy obejmuje parametr lub wartość zwracaną System.Boolean ale atrybut System.Runtime.InteropServices.MarshalAsAttribute nie jest stosowany do parametru lub wartości zwracanej.

Opis reguły

Metoda wywołania platformy posiada dostęp do kodu niezarządzanego i jest zdefiniowana za pomocą słowa kluczowego Declare w Visual Basic lub System.Runtime.InteropServices.DllImportAttribute.MarshalAsAttribute określa kierujące zachowanie, używanego do konwersji typów danych między kodem zarządzanym i niezarządzanym.Wiele prostych typów danych, takich jak System.Byte i System.Int32, mają pojedynczą reprezentację w kodzie niezarządzanym i nie wymagają specyfikacji ich zachowania kierującego; środowisko uruchomieniowe języka wspólnego automatycznie dostarcza prawidłowe zachowanie.

Typ danych Boolean ma wiele reprezentacji w kodzie niezarządzanym.Gdy MarshalAsAttribute nie jest określony, domyślnie zachowanie kierujące dla typu danych Boolean to UnmanagedType.Bool.Jest to 32-bitowa liczba całkowita, która nie jest właściwa we wszystkich okolicznościach.Reprezentacja Boolean jest wymagana przez niezarządzane metody, powinna być określona i dopasowana do odpowiedniego System.Runtime.InteropServices.UnmanagedType.UnmanagedType.Bool jest typu Win32 BOOL, który ma zawsze 4 bajty.UnmanagedType.U1 powinien być używany dla C++ bool lub innych typów 1-bajtowych.Aby uzyskać więcej informacji, zobacz Domyślnie, kierowanie dla typu Boolean.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, należy zastosować MarshalAsAttribute do parametru lub wartości zwracanej Boolean.Ustaw wartość atrybutu na odpowiedni UnmanagedType.

Kiedy pominąć ostrzeżenia

Nie należy pomijać ostrzeżenia dotyczącego tej reguły.Nawet jeśli właściwe jest domyślne zachowanie kierujące, kod jest łatwiejszy w utrzymaniu, kiedy zachowanie jest jawnie określone.

Przykład

W poniższym przykładzie przedstawiono dwie metody wywołania platformy, które są oznaczone odpowiednimi atrybutami MarshalAsAttribute.

Imports System
Imports System.Runtime.InteropServices

<assembly: ComVisible(False)>
Namespace UsageLibrary

   <ComVisible(True)> _
   Class NativeMethods

      Private Sub New()
      End Sub

      <DllImport("user32.dll", SetLastError := True)> _
      Friend Shared Function MessageBeep(uType As UInt32) _
         As <MarshalAs(UnmanagedType.Bool)> Boolean
      End Function

      <DllImport("mscoree.dll", SetLastError := True)> _
      Friend Shared Function StrongNameSignatureVerificationEx( _
         <MarshalAs(UnmanagedType.LPWStr)> wszFilePath As String, _
         <MarshalAs(UnmanagedType.U1)> fForceVerification As Boolean, _
         <MarshalAs(UnmanagedType.U1)> ByRef pfWasVerified As Boolean) _
         As <MarshalAs(UnmanagedType.U1)> Boolean
      End Function

   End Class

End Namespace
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);
   }
}
using namespace System;
using namespace System::Runtime::InteropServices;

[assembly: ComVisible(false)];
namespace InteroperabilityLibrary
{
   [ComVisible(true)]
   ref class NativeMethods
   {
   private:
      NativeMethods() {}

   internal:
      [DllImport("user32.dll", SetLastError = true)]
      [returnvalue: MarshalAs(UnmanagedType::Bool)]
      static Boolean MessageBeep(UInt32 uType);

      [DllImport("mscoree.dll", 
                 CharSet = CharSet::Unicode, 
                 SetLastError = true)]
      [returnvalue: MarshalAs(UnmanagedType::U1)]
      static bool StrongNameSignatureVerificationEx(
         [MarshalAs(UnmanagedType::LPWStr)] String^ wszFilePath,
         [MarshalAs(UnmanagedType::U1)] Boolean fForceVerification,
         [MarshalAs(UnmanagedType::U1)] Boolean^ pfWasVerified);
   };
}

Powiązane reguły

CA1901: Deklaracje P/Invoke powinien być przenośne

CA2101: Określ kierowanie dla argumentów typu string P/Invoke.

Zobacz też

Informacje

System.Runtime.InteropServices.UnmanagedType

Koncepcje

Domyślnie, kierowanie dla typu Boolean

Inne zasoby

Współdziałanie z kodu niezarządzanego