Sdílet prostřednictvím


CA1415: Správně deklarovat P/Invokes

TypeName

DeclarePInvokesCorrectly

CheckId

CA1415

Kategorie

Microsoft.interoperability

Narušující změna

Nenarušující - není-li službu P/Invoke deklarující parametr vidět mimo sestavení.Narušující - je-li službu P/Invoke deklarující parametr vidět mimo sestavení.

Příčina

Nesprávně deklarovaná metoda P/Invoke.

Popis pravidla

Metoda P/Invoke přistupuje k nespravovanému kódu, přičemž je definována pomocí klíčového slova Declare v jazyce Visual Basic nebo atributem System.Runtime.InteropServices.DllImportAttribute.V současné době toto pravidlo hledá deklarace metod P/Invoke zacílených na funkce Win32, které obsahují ukazatel na parametr struktury OVERLAPPED, přičemž odpovídající spravovaný parametr není ukazatelem na strukturu System.Threading.NativeOverlapped.

Jak vyřešit porušení

Chcete-li opravit porušení tohoto pravidla, deklarujte správně metodu P/Invoke.

Kdy potlačit upozornění

Nepotlačujte upozornění na toto pravidlo.

Příklad

Následující příklad ukazuje metody P/Invoke porušující i splňující toto pravidlo.

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

Viz také

Další zdroje

Spolupráce s nespravovaným kódem.