Compartilhar via


CA1414: marcar argumentos P/Invoke boolianos com MarshalAs

TypeName

MarkBooleanPInvokeArgumentsWithMarshalAs

CheckId

CA1414

Categoria

Microsoft.Interoperability

Alteração Significativa

Quebra

Causa

Uma declaração de método de invocação de plataforma do inclui um parâmetro ou um valor de retorno Boolean mas o atributo de MarshalAsAttribute não é aplicado ao parâmetro ou ao valor de retorno.

Descrição da Regra

Um método de invocação de plataforma acessa o código não gerenciado e é definido com a palavra-chave de Declare em Visual Basic ou em DllImportAttribute.MarshalAsAttribute especifica o comportamento marshaling usado para converter tipos de dados entre o código gerenciado e não gerenciado.Muitos tipos de dados simples, como Byte e Int32, têm uma única representação em código não gerenciado e que não exigem a especificação de seu comportamento marshaling; Common Language Runtime fornece automaticamente comportamento correto.

O tipo de dados de Boolean tiver várias representações em código não gerenciado.Quando MarshalAsAttribute não for especificado, o comportamento marshaling do padrão para o tipo de dados de Boolean é UnmanagedType.Bool.Este é um inteiro de 32 bits, que não é apropriada em todas as condições.A representação booliana que é exigida pelo método não gerenciado deve ser determinada e corresponde a UnmanagedTypeapropriado.UnmanagedType.Bool é o tipo do Win32 BOOL, que sempre é 4 bytes.UnmanagedType.U1 deve ser usado para C++ bool ou outros tipos de 1 byte.Para obter mais informações, consulte Marshaling padrão para tipos Boolean.

Como Corrigir Violações

Para corrigir uma violação desta regra, aplique MarshalAsAttribute para o parâmetro ou ao valor de retorno de Boolean .Defina o valor do atributo a UnmanagedTypeapropriado.

Quando Suprimir Alertas

Não elimine um alerta desta regra.Se o comportamento marshaling de opção é apropriado, o código é mantido mais facilmente quando o comportamento é especificado explicitamente.

Exemplo

O exemplo a seguir mostra dois métodos de invocação de plataforma que são marcados com os atributos apropriados de 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);
   };
}

Regras Relacionadas

CA1901: as declarações de P/Invoke devem ser portáteis

CA2101: especificar marshaling para argumentos da cadeia de caracteres P/Invoke

Consulte também

Referência

UnmanagedType

Conceitos

Marshaling padrão para tipos Boolean

Outros recursos

Interoperação com código não gerenciado