CA1414:以 MarshalAs 標記布林值 P/Invoke 引數
型別名稱 |
MarkBooleanPInvokeArgumentsWithMarshalAs |
CheckId |
CA1414 |
分類 |
Microsoft.Interoperability |
中斷變更 |
中斷 |
原因
平台叫用方法宣告包含 Boolean 參數或傳回值,但 MarshalAsAttribute 屬性 (Attribute) 不適用該參數或傳回值。
規則描述
平台叫用方法會存取 Unmanaged 程式碼,而且是使用 Visual Basic 中之 Declare 關鍵字或 DllImportAttribute 所定義的。MarshalAsAttribute 指定用來在 Managed 和 Unmanaged 程式碼之間,轉換資料型別的封送處理行為。許多簡單的資料型別 (例如 Byte 和 Int32) 在 Unmanaged 程式碼中都有單一表示,且不需要指定它們的封送處理行為,Common Language Runtime 即會自動提供正確的行為。
Boolean 資料型別在 Unmanaged 程式碼中有多種表示。未指定 MarshalAsAttribute 時,Boolean 資料型別的預設封送處理行為是 UnmanagedType.Bool。這是 32 位元的整數,但不適用所有情況。Unmanaged 方法所需的布林表示應加以判斷,並符合適當的 UnmanagedType。UnmanagedType.Bool 是 Win32 BOOL 型別,其一定為 4 位元組。UnmanagedType.U1 應該用於 C++ bool 或其他 1 位元組的型別。如需詳細資訊,請參閱布林類型的預設封送處理。
如何修正違規
若要修正此規則的違規情形,請將 MarshalAsAttribute 套用至 Boolean 參數或傳回值。將屬性值設定成適當的 UnmanagedType。
隱藏警告的時機
請勿隱藏此規則的警告。即使是適當的預設封送處理行為,只要明確指定該行為,即可輕易地維護程式碼。
範例
下列範例會顯示兩個以適當 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);
};
}
相關規則
CA2101:必須指定 P/Invoke 字串引數的封送處理