共用方式為


CA1414:以 MarshalAs 標記布林值 P/Invoke 引數

型別名稱

MarkBooleanPInvokeArgumentsWithMarshalAs

CheckId

CA1414

分類

Microsoft.Interoperability

中斷變更

中斷

原因

平台叫用方法宣告包含 Boolean 參數或傳回值,但 MarshalAsAttribute 屬性 (Attribute) 不適用該參數或傳回值。

規則描述

平台叫用方法會存取 Unmanaged 程式碼,而且是使用 Visual Basic 中之 Declare 關鍵字或 DllImportAttribute 所定義的。MarshalAsAttribute 指定用來在 Managed 和 Unmanaged 程式碼之間,轉換資料型別的封送處理行為。許多簡單的資料型別 (例如 ByteInt32) 在 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);
   };
}

相關規則

CA1901:P/Invoke 宣告應該是可移植的

CA2101:必須指定 P/Invoke 字串引數的封送處理

請參閱

參考

UnmanagedType

概念

布林類型的預設封送處理

其他資源

與 Unmanaged 程式碼互通