Partilhar via


CA1414: Marcar booleanos argumentos de P/Invoke com MarshalAs

TypeName

MarkBooleanPInvokeArgumentsWithMarshalAs

CheckId

CA1414

<strong>Categoria</strong>

Microsoft.Interoperability

Alteração significativa

Quebrando

Causa

Uma plataforma de invocar o método declaração inclui uma System.Boolean valor de parâmetro ou retorno, mas o System.Runtime.InteropServices.MarshalAsAttribute atributo não é aplicado ao valor de parâmetro ou retorno.

Descrição da regra

Uma plataforma chamar código não gerenciado do método acessos e é definida usando o Declare palavra-chave na Visual Basic ou o System.Runtime.InteropServices.DllImportAttribute.MarshalAsAttributeEspecifica o comportamento de empacotamento é usado para converter tipos de dados entre código gerenciado e.Muitos dados simples tipos, tais como System.Byte e System.Int32, ter uma única representação em código não gerenciado e não exigem a especificação de seu comportamento de empacotamento; o common language runtime fornece automaticamente o comportamento correto.

O Boolean tipo de dados possui diversas representações em código não gerenciado.Quando o MarshalAsAttribute não for especificado, o padrão de empacotamento comportamento para o Boolean é do tipo de dados UnmanagedType.Bool.Este é um inteiro de 32 bits, que não é adequado em todas as circunstâncias.A representação booleana que é necessária para o método não gerenciado deve ser determinada e coincidem com o apropriado System.Runtime.InteropServices.UnmanagedType.UnmanagedType.Bool é o tipo de BOOL Win32, que sempre tem 4 bytes.UnmanagedType.U1 deve ser usado para C++ bool ou outros tipos de 1 byte.Para obter mais informações, consulte Padrão de empacotamento para tipos booleanos.

Como corrigir violações

Para corrigir uma violação desta regra, aplicar MarshalAsAttribute para o Boolean valor de parâmetro ou retorno.Defina o valor do atributo para o apropriado UnmanagedType.

Quando suprimir avisos

Não suprimir um aviso da regra.Mesmo que o padrão de empacotamento comportamento for apropriado, o código mais fácil é mantido quando o comportamento for especificado explicitamente.

Exemplo

O exemplo a seguir mostra os métodos marcados com o apropriado de invocação de plataforma de dois MarshalAsAttribute atributos.

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: Declarações P/Invoke devem ser portátil

CA2101: Especifique o empacotamento para argumentos de seqüência de caracteres de P/Invoke.

Consulte também

Referência

System.Runtime.InteropServices.UnmanagedType

Conceitos

Padrão de empacotamento para tipos booleanos

Outros recursos

Interoperar com código não gerenciado