Поделиться через


CA1415: правильно объявляйте методы P/Invoke

TypeName

DeclarePInvokesCorrectly

CheckId

CA1415

Категория

Microsoft.Interoperability

Критическое изменение

Неразрывный - Если P/Invoke, который объявляет параметр, не может быть видим за пределами сборки.Breaking - Если P/Invoke, который объявляет параметр, может быть видим за пределами сборки.

Причина

Неправильно объявлен метод вызова платформы.

Описание правила

Метод вызова платформы получает доступ к неуправляемому коду и определяется с помощью ключевого слова Declare в Visual Basic или DllImportAttribute.В настоящее время это правило ищет объявления методов вызова платформы, нацеленных на функции Win32, имеющих указатель на параметр структуры OVERLAPPED, если соответствующий управляемый параметр не является указателем на структуру 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);
    }
}

См. также

Другие ресурсы

Взаимодействие с неуправляемым кодом