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
Conceitos
Marshaling padrão para tipos Boolean