Condividi tramite


Dichiarare correttamente i P/Invoke

Aggiornamento: novembre 2007

TypeName

DeclarePInvokesCorrectly

CheckId

CA1415

Categoria

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 richiamo piattaforma non è stato dichiarato correttamente.

Descrizione della regola

Un metodo di richiamo piattaforma accede al codice non gestito e viene definito mediante la parola chiave Declare in Visual Basic o mediante l'attributo System.Runtime.InteropServices.DllImportAttribute. Attualmente questa regola ricerca le dichiarazioni del metodo di richiamo piattaforma 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.

Correzione di violazioni

Per correggere una violazione di questa regola, dichiarare correttamente il metodo di richiamo piattaforma.

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