CA1415:正确声明 P/Invoke

类型名

DeclarePInvokesCorrectly

CheckId

CA1415

类别

Microsoft.Interoperability

是否重大更改

无间断 - 如果声明该参数的 P/Invoke 在程序集外部不可见。 间断 - 如果声明该参数的 P/Invoke 在程序集外部可见。

原因

平台调用方法未正确声明。

规则说明

平台调用方法访问非托管代码,而且是使用 Visual Basic 中的 Declare 关键字或使用 System.Runtime.InteropServices.DllImportAttribute 定义的。 此规则当前查找针对 Win32 函数、且满足以下条件的平台调用方法声明:这些方法具有指向 OVERLAPPED 结构参数的指针,而对应的托管参数却不是指向 System.Threading.NativeOverlapped 结构的指针。

如何解决冲突

若要修复与该规则的冲突,请正确地声明平台调用方法。

何时禁止显示警告

不要禁止显示此规则发出的警告。

示例

下面的示例分别演示了与该规则冲突以及满足该规则的平台调用方法。

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

请参见

其他资源

与非托管代码交互操作