Condividi tramite


CA1400: I punti di ingresso P/Invoke devono esistere

Articolo Valore
ID regola CA1400
Category Microsoft.Interoperability
Modifica Nessuna interruzione

Causa

Un metodo pubblico o protetto è contrassegnato con .System.Runtime.InteropServices.DllImportAttribute Non è possibile individuare la libreria non gestita né associare il metodo a una funzione nella libreria. Se la regola non riesce a trovare il nome del metodo esattamente come specificato, cerca le versioni ANSI o wide-character del metodo assegnando il suffisso al nome del metodo con 'A' o 'W'. Se non viene trovata alcuna corrispondenza, la regola tenta di individuare una funzione usando il formato del nome __stdcall (_MyMethod@12, dove 12 rappresenta la lunghezza degli argomenti). Se non viene trovata alcuna corrispondenza e il nome del metodo inizia con '#', la regola cerca la funzione come riferimento ordinale anziché come riferimento a un nome.

Nota

Questa regola è stata deprecata. Per altre informazioni, vedere Regole deprecate.

Descrizione regola

Non è disponibile alcun controllo in fase di compilazione per assicurarsi che i metodi contrassegnati con DllImportAttribute si trovino nella DLL non gestita a cui si fa riferimento. Se nella libreria non è presente alcuna funzione con il nome specificato o se 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 con l'attributo DllImportAttribute . Assicurarsi che la libreria non gestita esista e che si trova nella stessa directory dell'assembly che contiene il metodo . Se la libreria è presente e a cui viene fatto riferimento correttamente, verificare che il nome del metodo, il tipo restituito e la firma dell'argomento corrispondano alla funzione di libreria.

Quando eliminare gli avvisi

Non eliminare un avviso da questa regola quando la libreria non gestita si trova nella stessa directory dell'assembly gestito che vi fa riferimento. Potrebbe essere possibile eliminare un avviso da questa regola nel caso in cui non sia possibile trovare la libreria non gestita.

Esempio

Nell'esempio seguente viene illustrato un tipo che viola la regola. Nessuna funzione denominata DoSomethingUnmanaged si verifica 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();
   }
}

Vedi anche

System.Runtime.InteropServices.DllImportAttribute