Udostępnij za pośrednictwem


CA1415: Należy poprawnie zadeklarować P/Invokes

TypeName

DeclarePInvokesCorrectly

CheckId

CA1415

Kategoria

Microsoft.Interoperability

Zmiana kluczowa

Niekluczowa - jeśli P/Invoke, który deklaruje parametr nie jest widoczny poza zestawem.Kluczowa - jeśli P/Invoke, który deklaruje parametr jest widoczny poza zestawem.

Przyczyna

Metoda wywołania platformy jest nieprawidłowo zadeklarowana.

Opis reguły

Metoda wywołania platformy posiada dostęp do kodu niezarządzanego i jest zdefiniowana za pomocą słowa kluczowego Declare w Visual Basic lub DllImportAttribute.Obecnie ta reguła wyszukuje deklaracji metod wywołania platformy, których obiektami docelowymi są funkcje Win32 posiadające wskaźnik do parametru struktury Nakładającej, a odpowiadający parametr zarządzany nie jest wskaźnikiem do struktury NativeOverlapped.

Jak naprawić naruszenia

Aby naprawić naruszenie tej zasady, należy poprawnie zadeklarować metodę wywołania platformy.

Kiedy pominąć ostrzeżenia

Nie należy pomijać ostrzeżenia dotyczącego tej reguły.

Przykład

W poniższym przykładzie pokazane zostały metody wywołania platformy, które naruszają i spełniają regułę.

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

Zobacz też

Inne zasoby

Współdziałanie z kodem niezarządzanym