CA1414: Označte logické hodnoty volání nespravovaného kódu pomocí MarshalAs
Název_typu |
MarkBooleanPInvokeArgumentsWithMarshalAs |
CheckId |
CA1414 |
Kategorie |
Microsoft.interoperability |
Změnit rozdělení |
Rozdělení |
Příčina
Platforma vyvolat metodu prohlášení zahrnuje Boolean hodnotu parametru nebo return, ale MarshalAsAttribute atributu nejsou použity hodnoty parametru nebo return.
Popis pravidla
Platforma vyvolat metodu přístupů nespravovaný kód a je definován pomocí Declare klíčové slovo v Visual Basic nebo DllImportAttribute.MarshalAsAttributeUrčuje zařazovacího chování, které slouží k převodu typů dat mezi spravovaného a nespravovaného kódu.Mnoho jednoduché datové typy, například Byte a Int32, jednotného zastoupení v nespravovaný kód a nevyžadují specifikace jejich zařazovacího chování; společný jazykový modul runtime automaticky poskytuje správné chování.
Boolean Datový typ má více zastoupení v nespravovaný kód.Když MarshalAsAttribute není zadán, výchozí chování pro zařazování Boolean datový typ je UnmanagedType.Bool.Toto je 32bitové číslo, které není vhodné za všech okolností.Logické zastoupení vyžadovaná nespravované metoda by určena a odpovídají na odpovídající UnmanagedType.UnmanagedType.Bool je typ Win32 BOOL, který je vždy 4 bajty.UnmanagedType.U1 má být použita pro C++ bool nebo jiné typy 1 bajt.Další informace naleznete v tématu Výchozí zařazování pro logické typy.
Jak opravit porušení
Vyřešit porušení tohoto pravidla platí MarshalAsAttribute se Boolean hodnotu parametru nebo return.Nastavit hodnotu atributu na příslušnou UnmanagedType.
Při potlačení upozornění
Nepotlačovat upozornění od tohoto pravidla.I v případě, že je vhodné výchozí chování zařazování, kód snadněji zachována při chování explicitně zadán.
Příklad
Následující příklad ukazuje dva platform vyvolat metody, které jsou označeny příslušnou MarshalAsAttribute atributy.
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);
};
}
Souvisejících pravidel
CA1901: Deklarace volání nespravovaného kódu by měla být přenosná
CA2101: Určete kódování pro argumenty řetězce volání nespravovaného kódu
Viz také
Referenční dokumentace
Koncepty
Výchozí zařazování pro logické typy