Sdílet prostřednictvím


CA1414: Označte logické hodnoty volání nespravovaného kódu pomocí MarshalAs

Název_typu

MarkBooleanPInvokeArgumentsWithMarshalAs

CheckId

CA1414

Kategorie

Microsoft.interoperability

Změnit rozdělení

Rozdělení

Příčina

Platforma vyvolat metodu prohlášení zahrnuje Boolean hodnotu parametru nebo return, ale 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 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 Byte a 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í 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í zařazování pro logické typy.

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: Deklarace volání nespravovaného kódu by měla být přenosná

CA2101: Určete kódování pro argumenty řetězce volání nespravovaného kódu

Viz také

Referenční dokumentace

UnmanagedType

Koncepty

Výchozí zařazování pro logické typy

Další zdroje

Spolupráce s nespravovaným kódem