Condividi tramite


CA1415: Dichiarare correttamente i P/Invoke

TypeName

DeclarePInvokesCorrectly

CheckId

CA1415

Category

Microsoft.Interoperability

Breaking Change

Non sostanziale: se il P/Invoke che dichiara il parametro non è visibile all'esterno dell'assembly. Sostanziale: se il P/Invoke che dichiara il parametro è visibile all'esterno dell'assembly.

Causa

Un metodo di platform invoke non è stato dichiarato correttamente.

Descrizione della regola

Un metodo di platform invoke accede al codice non gestito e viene definito mediante la parola chiave Declare in Visual Basic o mediante System.Runtime.InteropServices.DllImportAttribute. Attualmente questa regola ricerca le dichiarazioni del metodo di platform invoke per le funzioni Win32 con un puntatore a un parametro di struttura OVERLAPPED e il cui parametro gestito corrispondente non è un puntatore a una struttura System.Threading.NativeOverlapped.

Come correggere le violazioni

Per correggere una violazione di questa regola, dichiarare correttamente il metodo di platform invoke.

Esclusione di avvisi

Non escludere un avviso da questa regola.

Esempio

Nell'esempio riportato di seguito vengono visualizzati i metodi di richiamo piattaforma che violano e soddisfano la regola.

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

Vedere anche

Altre risorse

Interoperabilità con codice non gestito