CA1415: P/Invoke を正しく宣言します
TypeName |
DeclarePInvokesCorrectly |
CheckId |
CA1415 |
[カテゴリ] |
Microsoft.Interoperability |
互換性に影響する変更点 |
なし - パラメーターを宣言する P/Invoke がアセンブリの外部で参照できない場合あり - パラメーターを宣言する P/Invoke がアセンブリの外部で参照できる場合 |
原因
プラットフォーム呼び出しメソッドの宣言が正しくありません。
規則の説明
プラットフォーム呼び出しメソッドは、Visual Basic の Declare キーワードまたは System.Runtime.InteropServices.DllImportAttribute を使用して、アンマネージ コードにアクセスし、定義されます。現在この規則では、OVERLAPPED 構造体パラメーターへのポインターを持ち、対応するマネージ型パラメーターが System.Threading.NativeOverlapped 構造体へのポインターではない Win32 関数に対するプラットフォーム呼び出しメソッドが対象になります。
違反の修正方法
この規則違反を修正するには、プラットフォーム呼び出しメソッドを正しく宣言します。
警告を抑制する状況
この規則による警告は抑制しないでください。
使用例
規則に違反するプラットフォーム呼び出しメソッドと、規則を満たすプラットフォーム呼び出しメソッドを次の例に示します。
using System;
using System.Runtime.InteropServices;
using System.Threading;
namespace InteroperabilityLibrary
{
// The platform invoke methods in this class violate the rule.
[ComVisible(true)]
internal class NativeMethods
{
private NativeMethods() { }
[DllImport("kernel32.dll", SetLastError = true)]
internal extern static uint ReadFile(
IntPtr hFile, IntPtr lpBuffer, int nNumberOfBytesToRead,
IntPtr lpNumberOfBytesRead, IntPtr overlapped);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal extern static bool ReadFileEx(
IntPtr hFile, IntPtr lpBuffer, int nNumberOfBytesToRead,
NativeOverlapped overlapped, IntPtr lpCompletionRoutine);
}
// The platform invoke methods in this class satisfy the rule.
[ComVisible(true)]
internal class UnsafeNativeMethods
{
private UnsafeNativeMethods() { }
//To compile this code, uncomment these lines and compile
//with "/unsafe".
//[DllImport("kernel32.dll", SetLastError = true)]
//unsafe internal extern static uint ReadFile(
// IntPtr hFile, IntPtr lpBuffer, int nNumberOfBytesToRead,
// IntPtr lpNumberOfBytesRead, NativeOverlapped* overlapped);
//[DllImport("kernel32.dll", SetLastError = true)]
//[return: MarshalAs(UnmanagedType.Bool)]
//unsafe internal extern static bool ReadFileEx(
// IntPtr hFile, IntPtr lpBuffer, int nNumberOfBytesToRead,
// NativeOverlapped* overlapped, IntPtr lpCompletionRoutine);
}
}