Sdílet prostřednictvím


CA1414: Označte logické argumenty P/Invoke s MarshalAs má

Název_typu

MarkBooleanPInvokeArgumentsWithMarshalAs

CheckId

CA1414

Kategorie

Microsoft.interoperability

Změnit rozdělení

Rozdělení

Příčina

Platforma vyvolat metodu prohlášení zahrnuje System.Boolean hodnotu parametru nebo return, ale System.Runtime.InteropServices.MarshalAsAttribute atributu nejsou použity hodnoty parametru nebo return.

Popis pravidla

Platforma vyvolat metodu přístupů nespravovaný kód a je definován pomocí Declare klíčové slovo v Visual Basic nebo System.Runtime.InteropServices.DllImportAttribute.MarshalAsAttributeUrčuje zařazovacího chování, které slouží k převodu typů dat mezi spravovaného a nespravovaného kódu.Mnoho jednoduché datové typy, například System.Byte a System.Int32, jednotného zastoupení v nespravovaný kód a nevyžadují specifikace jejich zařazovacího chování; společný jazykový modul runtime automaticky poskytuje správné chování.

Boolean Datový typ má více zastoupení v nespravovaný kód.Když MarshalAsAttribute není zadán, výchozí chování pro zařazování Boolean datový typ je UnmanagedType.Bool.Toto je 32bitové číslo, které není vhodné za všech okolností.Logické zastoupení vyžadovaná nespravované metoda by určena a odpovídají na odpovídající System.Runtime.InteropServices.UnmanagedType.UnmanagedType.Bool je typ Win32 BOOL, který je vždy 4 bajty.UnmanagedType.U1 má být použita pro C++ bool nebo jiné typy 1 bajt.Další informace naleznete v tématu Výchozí kódování pro typy logických.

Jak opravit porušení

Vyřešit porušení tohoto pravidla platí MarshalAsAttribute se Boolean hodnotu parametru nebo return.Nastavit hodnotu atributu na příslušnou UnmanagedType.

Při potlačení upozornění

Nepotlačovat upozornění od tohoto pravidla.I v případě, že je vhodné výchozí chování zařazování, kód snadněji zachována při chování explicitně zadán.

Příklad

Následující příklad ukazuje dva platform vyvolat metody, které jsou označeny příslušnou MarshalAsAttribute atributy.

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

Souvisejících pravidel

CA1901: P/Invoke prohlášení by mělo být přenosný

CA2101: Zadejte zařazování pro řetězcové argumenty P/Invoke.

Viz také

Referenční dokumentace

System.Runtime.InteropServices.UnmanagedType

Koncepty

Výchozí kódování pro typy logických

Další zdroje

Spolupráce s nespravovaným kódem.