EntryPointNotFoundException Classe
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Eccezione generata quando un tentativo di caricamento di una classe non riesce a causa dell'assenza di un metodo di immissione.
public ref class EntryPointNotFoundException : TypeLoadException
public class EntryPointNotFoundException : TypeLoadException
[System.Serializable]
public class EntryPointNotFoundException : TypeLoadException
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class EntryPointNotFoundException : TypeLoadException
type EntryPointNotFoundException = class
inherit TypeLoadException
[<System.Serializable>]
type EntryPointNotFoundException = class
inherit TypeLoadException
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type EntryPointNotFoundException = class
inherit TypeLoadException
Public Class EntryPointNotFoundException
Inherits TypeLoadException
- Ereditarietà
- Attributi
Commenti
Viene generata un'eccezione EntryPointNotFoundException quando Common Language Runtime non è in grado di caricare un assembly perché non è in grado di identificare il punto di ingresso dell'assembly. Questa eccezione può essere generata nelle condizioni seguenti:
Common Language Runtime non è in grado di individuare un punto di ingresso dell'applicazione (in genere un
Mainmetodo) in un assembly eseguibile. Il punto di ingresso dell'applicazione deve essere un metodo globale ostaticche non dispone di parametri o di una matrice di stringhe come unico parametro. Il punto di ingresso può restituirevoido restituire un Int32 codice di uscita o UInt32 . Un assembly dell'applicazione non può definire più di un punto di ingresso.Impossibile risolvere la chiamata a una funzione in una DLL Windows perché non è possibile trovare la funzione. Nell'esempio seguente viene generata un'eccezione EntryPointNotFoundException perché User32.dll non include una funzione denominata
GetMyNumber.using System; using System.Runtime.InteropServices; public class Example { [DllImport("user32.dll")] public static extern int GetMyNumber(); public static void Main() { try { int number = GetMyNumber(); } catch (EntryPointNotFoundException e) { Console.WriteLine("{0}:\n {1}", e.GetType().Name, e.Message); } } } // The example displays the following output: // EntryPointNotFoundException: // Unable to find an entry point named 'GetMyNumber' in DLL 'User32.dll'.open System open System.Runtime.InteropServices [<DllImport "user32.dll">] extern int GetMyNumber() try let number = GetMyNumber() () with :? EntryPointNotFoundException as e -> printfn $"{e.GetType().Name}:\n {e.Message}" // The example displays the following output: // EntryPointNotFoundException: // Unable to find an entry point named 'GetMyNumber' in DLL 'User32.dll'.Module Example Declare Auto Function GetMyNumber Lib "User32.dll" () As Integer Public Sub Main() Try Dim number As Integer = GetMyNumber() Catch e As EntryPointNotFoundException Console.WriteLine("{0}:{2} {1}", e.GetType().Name, e.Message, vbCrLf) End Try End Sub End Module ' The example displays the following output: ' EntryPointNotFoundException: ' Unable to find an entry point named 'GetMyNumber' in DLL 'User32.dll'.Impossibile risolvere la chiamata a una funzione in una DLL Windows perché il nome usato nella chiamata al metodo non corrisponde a un nome trovato nell'assembly. Ciò si verifica spesso perché il DllImportAttribute.ExactSpelling campo è impostato in modo implicito o esplicito su
true, il metodo chiamato include uno o più parametri stringa e ha sia una versione ANSI che una versione Unicode e il nome usato nella chiamata al metodo non corrisponde al nome di questa versione ANSI o Unicode. Nell'esempio seguente viene fornita un'illustrazione tentando di chiamare la funzione WindowsMessageBoxin User32.dll. Poiché la prima definizione del metodo specifica CharSet.Unicode per il marshalling di stringhe, common language cerca la versione a caratteri wide della funzione ,MessageBoxWanziché il nome usato nella chiamata al metodo .MessageBoxLa seconda definizione del metodo corregge questo problema chiamando inveceMessageBoxWdellaMessageBoxfunzione .using System; using System.Runtime.InteropServices; public class Example { [DllImport("user32.dll", CharSet = CharSet.Unicode, ExactSpelling = true )] public static extern int MessageBox(IntPtr hwnd, String text, String caption, uint type); [DllImport("user32.dll", CharSet = CharSet.Unicode, ExactSpelling = true )] public static extern int MessageBoxW(IntPtr hwnd, String text, String caption, uint type); public static void Main() { try { MessageBox(new IntPtr(0), "Calling the MessageBox Function", "Example", 0); } catch (EntryPointNotFoundException e) { Console.WriteLine("{0}:\n {1}", e.GetType().Name, e.Message); } try { MessageBoxW(new IntPtr(0), "Calling the MessageBox Function", "Example", 0); } catch (EntryPointNotFoundException e) { Console.WriteLine("{0}:\n {1}", e.GetType().Name, e.Message); } } }open System open System.Runtime.InteropServices [<DllImport("user32.dll", CharSet = CharSet.Unicode, ExactSpelling = true )>] extern int MessageBox(IntPtr hwnd, String text, String caption, uint ``type``) [<DllImport("user32.dll", CharSet = CharSet.Unicode, ExactSpelling = true )>] extern int MessageBoxW(IntPtr hwnd, String text, String caption, uint ``type``) try MessageBox(IntPtr 0, "Calling the MessageBox Function", "Example", 0u) |> ignore with :? EntryPointNotFoundException as e -> printfn $"{e.GetType().Name}:\n {e.Message}" try MessageBoxW(IntPtr 0, "Calling the MessageBox Function", "Example", 0u) |> ignore with :? EntryPointNotFoundException as e -> printfn $"{e.GetType().Name}:\n {e.Message}"Module Example Declare Unicode Function MessageBox Lib "User32.dll" Alias "MessageBox" ( ByVal hWnd As IntPtr, ByVal txt As String, ByVal caption As String, ByVal typ As UInteger) As Integer Declare Unicode Function MessageBox2 Lib "User32.dll" Alias "MessageBoxW" ( ByVal hWnd As IntPtr, ByVal txt As String, ByVal caption As String, ByVal typ As UInteger) As Integer Public Sub Main() Try MessageBox(IntPtr.Zero, "Calling the MessageBox Function", "Example", 0 ) Catch e As EntryPointNotFoundException Console.WriteLine("{0}:{2} {1}", e.GetType().Name, e.Message, vbCrLf) End Try Try MessageBox2(IntPtr.Zero, "Calling the MessageBox Function", "Example", 0 ) Catch e As EntryPointNotFoundException Console.WriteLine("{0}:{2} {1}", e.GetType().Name, e.Message, vbCrLf) End Try End Sub End ModuleSi sta provando a chiamare una funzione in una libreria di collegamento dinamico in base al nome semplice anziché al nome decorato. In genere, il compilatore C++ genera un nome decorato per le funzioni DLL. Ad esempio, il codice C++ seguente definisce una funzione denominata in una libreria denominata
DoubleTestDll.dll.__declspec(dllexport) int Double(int number) { return number * 2; }Quando il codice nell'esempio seguente tenta di chiamare la funzione, viene generata un'eccezione EntryPointNotFoundException perché non è possibile trovare la
Doublefunzione.using System; using System.Runtime.InteropServices; public class Example { [DllImport("TestDll.dll")] public static extern int Double(int number); public static void Main() { Console.WriteLine(Double(10)); } } // The example displays the following output: // Unhandled Exception: System.EntryPointNotFoundException: Unable to find // an entry point named 'Double' in DLL '.\TestDll.dll'. // at Example.Double(Int32 number) // at Example.Main()open System open System.Runtime.InteropServices [<DllImport "TestDll.dll">] extern int Double(int number) printfn $"{Double 10}" // The example displays the following output: // Unhandled Exception: System.EntryPointNotFoundException: Unable to find // an entry point named 'Double' in DLL '.\TestDll.dll'. // at Example.Double(Int32 number) // at Example.Main()Module Example Public Declare Function DoubleNum Lib ".\TestDll.dll" Alias "Double" _ (ByVal number As Integer) As Integer Public Sub Main() Console.WriteLine(DoubleNum(10)) End Sub End Module ' The example displays the following output: ' Unhandled Exception: System.EntryPointNotFoundException: Unable to find an ' entry point named 'Double' in DLL '.\TestDll.dll'. ' at Example.Double(Int32 number) ' at Example.Main()Tuttavia, se la funzione viene chiamata usando il relativo nome decorato (in questo caso ,
?Double@@YAHH@Z), la chiamata di funzione ha esito positivo, come illustrato nell'esempio seguente.using System; using System.Runtime.InteropServices; public class Example { [DllImport("TestDll.dll", EntryPoint = "?Double@@YAHH@Z")] public static extern int Double(int number); public static void Main() { Console.WriteLine(Double(10)); } } // The example displays the following output: // 20open System open System.Runtime.InteropServices [<DllImport("TestDll.dll", EntryPoint = "?Double@@YAHH@Z")>] extern int Double(int number) printfn $"{Double 10}" // The example displays the following output: // 20Module Example Public Declare Function DoubleNum Lib ".\TestDll.dll" Alias "?Double@@YAHH@Z" _ (ByVal number As Integer) As Integer Public Sub Main() Console.WriteLine(DoubleNum(10)) End Sub End Module ' The example displays the following output: ' 20È possibile trovare i nomi decorati delle funzioni esportate da una DLL usando un'utilità come Dumpbin.exe.
Si sta tentando di chiamare un metodo in un assembly gestito come se fosse una libreria di collegamento dinamico non gestita. Per visualizzare questa operazione in azione, compilare l'esempio seguente in un assembly denominato StringUtilities.dll.
using System; public static class StringUtilities { public static String SayGoodMorning(String name) { return String.Format("A top of the morning to you, {0}!", name); } }module StringUtilities let SayGoodMorning name = $"A top of the morning to you, %s{name}!"Module StringUtilities Public Function SayGoodMorning(name As String) As String Return String.Format("A top of the morning to you, {0}!", name) End Function End ModuleCompilare ed eseguire quindi l'esempio seguente, che tenta di chiamare il
StringUtilities.SayGoodMorningmetodo nella libreria di collegamento dinamico StringUtilities.dll come se fosse codice non gestito. Il risultato è un'eccezione EntryPointNotFoundException .using System; using System.Runtime.InteropServices; public class Example { [DllImport("StringUtilities.dll", CharSet = CharSet.Unicode )] public static extern String SayGoodMorning(String name); public static void Main() { Console.WriteLine(SayGoodMorning("Dakota")); } } // The example displays the following output: // Unhandled Exception: System.EntryPointNotFoundException: Unable to find an entry point // named 'GoodMorning' in DLL 'StringUtilities.dll'. // at Example.GoodMorning(String& name) // at Example.Main()open System open System.Runtime.InteropServices [<DllImport("StringUtilities.dll", CharSet = CharSet.Unicode )>] extern String SayGoodMorning(String name) printfn $"""{SayGoodMorning "Dakota"}""" // The example displays the following output: // Unhandled Exception: System.EntryPointNotFoundException: Unable to find an entry point // named 'GoodMorning' in DLL 'StringUtilities.dll'. // at Example.GoodMorning(String& name) // at Example.Main()Module Example Declare Unicode Function GoodMorning Lib "StringUtilities.dll" ( ByVal name As String) As String Public Sub Main() Console.WriteLine(SayGoodMorning("Dakota")) End Sub End Module ' The example displays the following output: ' Unhandled Exception: System.EntryPointNotFoundException: Unable to find an entry point ' named 'GoodMorning' in DLL 'StringUtilities.dll'. ' at Example.GoodMorning(String& name) ' at Example.Main()Per eliminare l'eccezione, aggiungere un riferimento all'assembly gestito e accedere al
StringUtilities.SayGoodMorningmetodo esattamente come si accede a qualsiasi altro metodo nel codice gestito, come nell'esempio seguente.using System; public class Example { public static void Main() { Console.WriteLine(StringUtilities.SayGoodMorning("Dakota")); } } // The example displays the following output: // A top of the morning to you, Dakota!printfn $"""{StringUtilities.SayGoodMorning "Dakota"}""" // The example displays the following output: // A top of the morning to you, Dakota!Module Example Public Sub Main() Console.WriteLine(StringUtilities.SayGoodMorning("Dakota")) End Sub End Module ' The example displays the following output: ' A top of the morning to you, Dakota!Si sta tentando di chiamare un metodo in una DLL COM come se fosse una DLL Windows. Per accedere a una DLL COM, selezionare l'opzione Aggiungi riferimento in Visual Studio per aggiungere un riferimento al progetto e quindi selezionare la libreria dei tipi dalla scheda COM.
Per un elenco dei valori iniziali delle proprietà per un'istanza di EntryPointNotFoundException, consultare i costruttori di EntryPointNotFoundException.
Costruttori
| Nome | Descrizione |
|---|---|
| EntryPointNotFoundException() |
Inizializza una nuova istanza della classe EntryPointNotFoundException. |
| EntryPointNotFoundException(SerializationInfo, StreamingContext) |
Obsoleti.
Inizializza una nuova istanza della EntryPointNotFoundException classe con dati serializzati. |
| EntryPointNotFoundException(String, Exception) |
Inizializza una nuova istanza della EntryPointNotFoundException classe con un messaggio di errore specificato e un riferimento all'eccezione interna che è la causa di questa eccezione. |
| EntryPointNotFoundException(String) |
Inizializza una nuova istanza della EntryPointNotFoundException classe con un messaggio di errore specificato. |
Proprietà
| Nome | Descrizione |
|---|---|
| Data |
Ottiene una raccolta di coppie chiave/valore che forniscono informazioni aggiuntive definite dall'utente sull'eccezione. (Ereditato da Exception) |
| HelpLink |
Ottiene o imposta un collegamento al file della Guida associato a questa eccezione. (Ereditato da Exception) |
| HResult |
Ottiene o imposta HRESULT, valore numerico codificato assegnato a un'eccezione specifica. (Ereditato da Exception) |
| InnerException |
Ottiene l'istanza Exception che ha causato l'eccezione corrente. (Ereditato da Exception) |
| Message |
Ottiene il messaggio di errore per questa eccezione. (Ereditato da TypeLoadException) |
| Source |
Ottiene o imposta il nome dell'applicazione o dell'oggetto che causa l'errore. (Ereditato da Exception) |
| StackTrace |
Ottiene una rappresentazione di stringa dei fotogrammi immediati nello stack di chiamate. (Ereditato da Exception) |
| TargetSite |
Ottiene il metodo che genera l'eccezione corrente. (Ereditato da Exception) |
| TypeName |
Ottiene il nome completo del tipo che causa l'eccezione. (Ereditato da TypeLoadException) |
Metodi
| Nome | Descrizione |
|---|---|
| Equals(Object) |
Determina se l'oggetto specificato è uguale all'oggetto corrente. (Ereditato da Object) |
| GetBaseException() |
Quando sottoposto a override in una classe derivata, restituisce l'oggetto Exception che rappresenta la causa radice di una o più eccezioni successive. (Ereditato da Exception) |
| GetHashCode() |
Funge da funzione hash predefinita. (Ereditato da Object) |
| GetObjectData(SerializationInfo, StreamingContext) |
Obsoleti.
Imposta l'oggetto SerializationInfo con il nome della classe, il nome del metodo, l'ID risorsa e informazioni aggiuntive sull'eccezione. (Ereditato da TypeLoadException) |
| GetType() |
Ottiene il tipo di runtime dell'istanza corrente. (Ereditato da Exception) |
| MemberwiseClone() |
Crea una copia superficiale del Objectcorrente. (Ereditato da Object) |
| ToString() |
Crea e restituisce una rappresentazione di stringa dell'eccezione corrente. (Ereditato da Exception) |
Eventi
| Nome | Descrizione |
|---|---|
| SerializeObjectState |
Obsoleti.
Si verifica quando viene serializzata un'eccezione per creare un oggetto stato dell'eccezione contenente dati serializzati sull'eccezione. (Ereditato da Exception) |