CA1414: Oznacz logiczne argumenty P/Invoke za pomocą MarshalAs
TypeName |
MarkBooleanPInvokeArgumentsWithMarshalAs |
CheckId |
CA1414 |
Kategoria |
Microsoft.Interoperability |
Zmiana kluczowa |
Kluczowa |
Przyczyna
Deklaracja metody wywołania platformy obejmuje parametr lub wartość zwracaną Boolean ale atrybut MarshalAsAttribute nie jest stosowany do parametru lub wartości zwracanej.
Opis reguły
Metoda wywołania platformy posiada dostęp do kodu niezarządzanego i jest zdefiniowana za pomocą słowa kluczowego Declare w Visual Basic lub DllImportAttribute.MarshalAsAttribute określa kierujące zachowanie, używanego do konwersji typów danych między kodem zarządzanym i niezarządzanym.Wiele prostych typów danych, takich jak Byte i Int32, mają pojedynczą reprezentację w kodzie niezarządzanym i nie wymagają specyfikacji ich zachowania kierującego; środowisko uruchomieniowe języka wspólnego automatycznie dostarcza prawidłowe zachowanie.
Typ danych Boolean ma wiele reprezentacji w kodzie niezarządzanym.Gdy MarshalAsAttribute nie jest określony, domyślnie zachowanie kierujące dla typu danych Boolean to UnmanagedType.Bool.Jest to 32-bitowa liczba całkowita, która nie jest właściwa we wszystkich okolicznościach.Reprezentacja Boolean jest wymagana przez niezarządzane metody, powinna być określona i dopasowana do odpowiedniego UnmanagedType.UnmanagedType.Bool jest typu Win32 BOOL, który ma zawsze 4 bajty.UnmanagedType.U1 powinien być używany dla C++ bool lub innych typów 1-bajtowych.Aby uzyskać więcej informacji, zobacz Organizowanie domyślne dotyczące typów logicznych danych.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, należy zastosować MarshalAsAttribute do parametru lub wartości zwracanej Boolean.Ustaw wartość atrybutu na odpowiedni UnmanagedType.
Kiedy pominąć ostrzeżenia
Nie należy pomijać ostrzeżenia dotyczącego tej reguły.Nawet jeśli właściwe jest domyślne zachowanie kierujące, kod jest łatwiejszy w utrzymaniu, kiedy zachowanie jest jawnie określone.
Przykład
W poniższym przykładzie przedstawiono dwie metody wywołania platformy, które są oznaczone odpowiednimi atrybutami 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);
};
}
Powiązane reguły
CA1901: Deklaracje P/Invoke powinny być przenośne
CA2101: Należy określić operacje organizacyjne dla argumentów typu string P/Invoke
Zobacz też
Informacje
Koncepcje
Organizowanie domyślne dotyczące typów logicznych danych