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.Byte や System.Int32 など、単純なデータ型の多くは、アンマネージ コードの単一の表現を持っており、マーシャリング動作を指定する必要はありません。共通言語ランタイムにより、適切な動作が自動的に提供されます。
Boolean データ型は、アンマネージ コードの複数の表現を持っています。 MarshalAsAttribute が指定されていない場合、Boolean データ型の既定のマーシャリング動作は UnmanagedType.Bool です。 これは 32 ビット整数であり、すべての状況に適しているわけではありません。 アンマネージ メソッドが必要とするブール型の表現を特定して、適切な System.Runtime.InteropServices.UnmanagedType に一致させる必要があります。 UnmanagedType.Bool は、Win32 BOOL 型であり、常に 4 バイトです。 UnmanagedType.U1 は、C++ bool や他の 1 バイト型に使用します。 詳細については、「Boolean 型に対する既定のマーシャリング」を参照してください。
違反の修正方法
この規則の反を修正するには、MarshalAsAttribute を Boolean パラメーターまたは戻り値に適用します。 属性の値を適切な 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