CA1414: Marcar os argumentos de P/Invoke booleanos 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 parâmetro ou valor de retorno.
Descrição da regra
Uma plataforma chamar código não gerenciado do método acessos e é definida usando o Declare palavra-chave em Visual Basic ou System.Runtime.InteropServices.DllImportAttribute. MarshalAsAttributeEspecifica o comportamento de empacotamento é usado para converter tipos de dados entre código gerenciado e. Muitos dados simples tipos, como System.Byte e System.Int32, têm 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 de 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 de Boolean é necessária para o método não gerenciado deve ser determinada e coincidem com apropriadas System.Runtime.InteropServices.UnmanagedType. UnmanagedType.Bool é o tipo BOOL do Win32, que é sempre 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 de tipos booleanos.
Como corrigir violações
Para corrigir uma violação desta regra, aplicar MarshalAsAttribute para o Boolean parâmetro ou valor de retorno. Defina o valor do atributo para o apropriado UnmanagedType.
Quando suprimir avisos
Não suprimir um aviso da regra. Mesmo se 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 são 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 de tipos booleanos