次の方法で共有


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);
    }
}

参照

その他の技術情報

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