次の方法で共有


CA1414: ブール型の P/Invoke 引数を MarshalAs に設定します

TypeName

MarkBooleanPInvokeArgumentsWithMarshalAs

CheckId

CA1414

[カテゴリ]

Microsoft.Interoperability

互換性に影響する変更点

あり

原因

プロパティ呼び出しメソッド宣言に System.Boolean パラメーターまたは戻り値が含まれていますが、System.Runtime.InteropServices.MarshalAsAttribute 属性がそのパラメーターまたは戻り値に適用されていません。

規則の説明

プラットフォーム呼び出しメソッドは、Visual Basic の Declare キーワードまたは System.Runtime.InteropServices.DllImportAttribute を使用して、アンマネージ コードにアクセスし、定義されます。MarshalAsAttribute は、マネージ コードとアンマネージ コード間のデータ型の変換に使用されるマーシャリング動作を指定します。System.ByteSystem.Int32 など、単純なデータ型の多くは、アンマネージ コードの単一の表現を持っており、マーシャリング動作を指定する必要はありません。共通言語ランタイムにより、適切な動作が自動的に提供されます。

Boolean データ型は、アンマネージ コードの複数の表現を持っています。MarshalAsAttribute が指定されていない場合、Boolean データ型の既定のマーシャリング動作は UnmanagedType.Bool です。これは 32 ビット整数であり、すべての状況に適しているわけではありません。アンマネージ メソッドが必要とするブール型の表現を特定して、適切な System.Runtime.InteropServices.UnmanagedType に一致させる必要があります。UnmanagedType.Bool は、Win32 BOOL 型であり、常に 4 バイトです。UnmanagedType.U1 は、C++ bool や他の 1 バイト型に使用します。詳細については、「Boolean 型に対する既定のマーシャリング」を参照してください。

違反の修正方法

この規則の反を修正するには、MarshalAsAttributeBoolean パラメーターまたは戻り値に適用します。属性の値を適切な UnmanagedType に設定します。

警告を抑制する状況

この規則による警告は抑制しないでください。既定のマーシャリング動作が適切な場合でも、動作を明示的に指定することにより、コードの保守がさらに簡単になります。

使用例

次の例は、適切な MarshalAsAttribute 属性でマークされた、2 つのプラットフォーム呼び出しメソッドを示しています。

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 文字列引数に対してマーシャリングを指定します

参照

関連項目

System.Runtime.InteropServices.UnmanagedType

概念

Boolean 型に対する既定のマーシャリング

その他の技術情報

アンマネージ コードとの相互運用