CA1400: I punti di ingresso P/Invoke devono esistere
TypeName |
PInvokeEntryPointsShouldExist |
CheckId |
CA1400 |
Category |
Microsoft.Interoperability |
Breaking Change |
Non sostanziale |
Causa
Un metodo pubblico o protetto è contrassegnato con l'attributo System.Runtime.InteropServices.DllImportAttribute. Non è possibile individuare la libreria non gestita né associare il metodo a una funzione nella libreria. Se non è possibile trovare esattamente il nome del metodo come specificato, vengono cercate versioni ANSI o a caratteri estesi del metodo aggiungendo al relativo nome il suffisso "A" o "W". Se non viene trovata alcuna corrispondenza, si tenta di individuare una funzione con il formato di denominazione __stdcall (_MyMethod@12, dove 12 rappresenta la lunghezza degli argomenti). Se non viene trovata alcuna corrispondenza e il nome del metodo inizia con "#", viene cercata la funzione come un riferimento ordinale anziché come riferimento del nome.
Descrizione della regola
Non è disponibile alcun controllo in fase di compilazione per assicurarsi che i metodi contrassegnati con DllImportAttribute siano presenti nella DLL non gestita a cui si fa riferimento. Se nella libreria non è presente alcuna funzione con il nome specificato oppure gli argomenti del metodo non corrispondono agli argomenti della funzione, Common Language Runtime genera un'eccezione.
Come correggere le violazioni
Per correggere una violazione di questa regola, correggere il metodo che presenta l'attributo DllImportAttribute. Assicurarsi che la libreria non gestita sia presente e si trovi nella stessa directory dell'assembly che contiene il metodo. Se la libreria è presente e dispone di un riferimento corretto, verificare che il nome del metodo, il tipo restituito e la firma dell'argomento corrispondano alla funzione della libreria.
Esclusione di avvisi
Non escludere un avviso da questa regola se la libreria non gestita si trova nella stessa directory dell'assembly gestito che fa riferimento ad essa. L'esclusione di un avviso da questa regola può essere sicura nel caso in cui non sia possibile individuare la libreria non gestita.
Esempio
Nell'esempio riportato di seguito viene illustrato un tipo che viola la regola. Non è presente alcuna funzione denominata DoSomethingUnmanaged in kernel32.dll.
using System.Runtime.InteropServices;
namespace InteroperabilityLibrary
{
public class NativeMethods
{
// If DoSomethingUnmanaged does not exist, or has
// a different signature or return type, the following
// code violates rule PInvokeEntryPointsShouldExist.
[DllImport("kernel32.dll")]
public static extern void DoSomethingUnmanaged();
}
}