共用方式為


請以 MarshalAs 標記布林 P/Invoke 引數

更新:2007 年 11 月

型別名稱

MarkBooleanPInvokeArgumentsWithMarshalAs

CheckId

CA1414

分類

Microsoft.Interoperability

中斷變更

中斷

原因

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

規則描述

平台叫用方法會存取 Unmanaged 程式碼,而且是使用 Visual Basic 中的 Declare 關鍵字或 System.Runtime.InteropServices.DllImportAttribute 予以定義。MarshalAsAttribute 指定用於轉換 Managed 與 Unmanaged 程式碼間之資料型別的封送處理 (Marshaling) 行為。許多簡單的資料型別 (例如 System.ByteSystem.Int32) 在 Unmanaged 程式碼中都有單一表示,且不需要指定它們的封送處理行為,Common Language Runtime 即會自動提供正確的行為。

Boolean 資料型別在 Unmanaged 程式碼中有多種表示。未指定 MarshalAsAttribute 時,Boolean 資料型別的預設封送處理行為是 UnmanagedType.Bool。這是 32 位元的整數,但不適用所有情況。Unmanaged 方法所需的布林表示應加以判斷,並符合適當的 System.Runtime.InteropServices.UnmanagedType。UnmanagedType.Bool 是 Win32 BOOL 型別,其一定為 4 位元組。UnmanagedType.U1 應該用於 C++ bool 或其他 1 位元組的型別。如需詳細資訊,請參閱 Boolean 型別的預設封送處理

如何修正違規

若要修正此規則的違規情形,請將 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);
   };
}

相關規則

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

請指定為 P/Invoke 字串引數進行封送處理

請參閱

概念

Boolean 型別的預設封送處理

參考

System.Runtime.InteropServices.UnmanagedType

其他資源

與 Unmanaged 程式碼互通