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