Compartir a través de


Marque los argumentos booleanos de P/Invoke con MarshalAs

Actualización: noviembre 2007

     TypeName

MarkBooleanPInvokeArgumentsWithMarshalAs

Identificador de comprobación

CA1414

Category

Microsoft.Interoperability

Cambio problemático

Motivo

Una declaración del método de invocación de plataforma incluye un valor devuelto o parámetro System.Boolean , pero el atributo System.Runtime.InteropServices.MarshalAsAttribute no se aplica a ese parámetro o valor devuelto.

Descripción de la regla

Un método de invocación de plataforma tiene acceso al código no administrado y se define utilizando la palabra clave Declare en Visual Basic o el atributo System.Runtime.InteropServices.DllImportAttribute. MarshalAsAttribute especifica el comportamiento de cálculo de referencias que se utiliza para convertir los tipos de datos entre el código administrado y el no administrado. Muchos tipos de datos sencillos, como System.Byte y System.Int32, tienen una sola representación en el código administrado y no necesitan que se especifique su comportamiento de cálculo de referencias, ya que Common Language Runtime facilita automáticamente el comportamiento correcto.

El tipo de datos Boolean tiene varias representaciones en el código no administrado. Cuando no se especifica MarshalAsAttribute, el comportamiento de cálculo de referencias predeterminado para el tipo de datos Boolean es UnmanagedType.Bool. Éste es un entero de 32 bits, que no es adecuado en todas las circunstancias. Se debería determinar la representación booleana requerida por el método no administrado y hacerla corresponder con el tipo System.Runtime.InteropServices.UnmanagedType adecuado. UnmanagedType.Bool es el tipo BOOL de Win32, que siempre es de 4 bytes. UnmanagedType.U1 se debe utilizar para bool de C++ u otros tipos de 1 byte. Para obtener más información, vea Cálculo de referencias predeterminado para tipos booleanos.

Cómo corregir infracciones

Para corregir una infracción de esta regla, aplique MarshalAsAttribute al valor devuelto o parámetro Boolean. Establezca el valor del atributo en el tipo UnmanagedType adecuado.

Cuándo suprimir advertencias

No suprima las advertencias de esta regla. Aunque el comportamiento de cálculo de referencias predeterminado sea adecuado, resulta más fácil mantener el código cuando se especifica el comportamiento de manera explícita.

Ejemplo

El ejemplo siguiente muestra dos métodos de invocación de plataforma marcados con los atributos MarshalAsAttribute adecuados.

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

Reglas relacionadas

Las declaraciones P/Invoke deben ser portátiles

Especifique el cálculo de referencias para los argumentos de cadenas P/Invoke

Vea también

Conceptos

Cálculo de referencias predeterminado para tipos booleanos

Referencia

System.Runtime.InteropServices.UnmanagedType

Otros recursos

Interoperar con código no administrado