EntryPointNotFoundException Osztály
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
A kivétel, amely akkor merül fel, ha egy osztály betöltése sikertelen, mert nincs belépési módszer.
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
- Öröklődés
- Attribútumok
Megjegyzések
Kivétel EntryPointNotFoundException jelenik meg, ha a közös nyelvi futtatókörnyezet nem tud betölteni egy szerelvényt, mert nem tudja azonosítani a szerelvény belépési pontját. Ez a kivétel a következő feltételek mellett hajtható végre:
A közös nyelvi futtatókörnyezet nem tud alkalmazásbeléptetési pontot (általában metódust
Main) találni egy végrehajtható szerelvényben. Az alkalmazás belépési pontjának globálisnak vagystaticmetódusnak kell lennie, amelynek nincs paramétere, vagy egy sztringtömb az egyetlen paramétere. A belépési pont vissza tud térnivoid, vagy visszaadhat egy vagy Int32 több kilépési UInt32 kódot. Egy alkalmazásszerelvény nem definiálhat egynél több belépési pontot.Az Windows DLL-ben lévő függvény hívása nem oldható fel, mert a függvény nem található. Az alábbi példában kivételt EntryPointNotFoundException ad a rendszer, mert User32.dll nem tartalmaz egy nevű
GetMyNumberfüggvényt.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'.Egy Windows DLL-ben lévő függvény hívása nem oldható fel, mert a metódushívásban használt név nem egyezik a szerelvényben található névvel. Ez gyakran azért fordul elő, mert a DllImportAttribute.ExactSpelling mező implicit módon vagy explicit módon van beállítva
true, a hívott metódus egy vagy több sztringparamétert tartalmaz, valamint ANSI-t és Unicode-verziót is tartalmaz, és a metódushívásban használt név nem felel meg ennek az ANSI- vagy Unicode-verziónak. Az alábbi példa a User32.dllWindowsMessageBoxfüggvény meghívásával mutat be illusztrációt. Mivel az első metódusdefiníció a sztring-műveletet határozza meg CharSet.Unicode , a közös nyelv a függvényMessageBoxWszéles karakterű verzióját keresi a metódushívásbanMessageBoxhasznált név helyett. A második metódusdefiníció úgy javítja ki ezt a problémát, hogy a függvény helyett a függvénytMessageBoxWMessageBoxhívja meg.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 ModuleEgy dinamikus hivatkozástárban lévő függvényt az egyszerű neve alapján próbál meghívni, nem pedig a kitüntetett neve alapján. A C++ fordító általában a DLL-függvények kitüntetett nevét hozza létre. A következő C++ kód például egy TestDll.dllnevű kódtárban definiál
Doubleegy függvényt.__declspec(dllexport) int Double(int number) { return number * 2; }Amikor a következő példában szereplő kód megpróbálja meghívni a függvényt, a rendszer kivételt EntryPointNotFoundException jelez, mert a
Doublefüggvény nem található.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()Ha azonban a függvény a kitüntetett nevével (ebben az esetben) van meghívva,
?Double@@YAHH@Za függvényhívás sikeres lesz, ahogy az alábbi példa is mutatja.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: ' 20A DLL által exportált függvények kitüntetett nevét egy olyan segédprogrammal találja meg, mint például a Dumpbin.exe.
Úgy próbál meghívni egy metódust egy felügyelt szerelvényben, mintha nem felügyelt dinamikus kapcsolatkódtár lenne. Ennek működés közbeni megtekintéséhez fordítsa le a következő példát egy StringUtilities.dllnevű szerelvényre.
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 ModuleEzután fordítsa le és hajtsa végre a következő példát, amely megkísérli meghívni a
StringUtilities.SayGoodMorningmetódust a StringUtilities.dll dinamikus hivatkozástárban, mintha nem felügyelt kód lenne. Az eredmény kivétel 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()A kivétel megszüntetéséhez adjon hozzá egy hivatkozást a felügyelt szerelvényhez, és ugyanúgy érje el a
StringUtilities.SayGoodMorningmetódust, mint bármely más, felügyelt kódban szereplő metódust, ahogy az alábbi példában is látható.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!Egy COM DLL-ben olyan metódust próbál meghívni, mintha Windows DLL lenne. COM DLL-hez való hozzáféréshez válassza a Hivatkozás hozzáadása lehetőséget Visual Studio a projektre mutató hivatkozás hozzáadásához, majd válassza ki a típustárat a COM lapon.
A EntryPointNotFoundException példány kezdeti tulajdonságainak listájáért tekintse meg a EntryPointNotFoundException konstruktorokat.
Konstruktorok
| Név | Description |
|---|---|
| EntryPointNotFoundException() |
Inicializálja a EntryPointNotFoundException osztály új példányát. |
| EntryPointNotFoundException(SerializationInfo, StreamingContext) |
Elavult.
Inicializálja az EntryPointNotFoundException osztály új példányát szerializált adatokkal. |
| EntryPointNotFoundException(String, Exception) |
Inicializálja az EntryPointNotFoundException osztály új példányát egy megadott hibaüzenettel és a kivétel okaként szolgáló belső kivételre mutató hivatkozással. |
| EntryPointNotFoundException(String) |
Inicializálja az EntryPointNotFoundException osztály új példányát egy megadott hibaüzenettel. |
Tulajdonságok
| Név | Description |
|---|---|
| Data |
Lekéri a kulcs-/érték párok gyűjteményét, amelyek további, felhasználó által definiált információkat biztosítanak a kivételről. (Öröklődés forrása Exception) |
| HelpLink |
Lekéri vagy beállítja a kivételhez társított súgófájlra mutató hivatkozást. (Öröklődés forrása Exception) |
| HResult |
Lekéri vagy beállítja a HRESULT-ot, egy kódolt numerikus értéket, amely egy adott kivételhez van hozzárendelve. (Öröklődés forrása Exception) |
| InnerException |
Lekéri az Exception aktuális kivételt okozó példányt. (Öröklődés forrása Exception) |
| Message |
Lekéri a kivételhez tartozó hibaüzenetet. (Öröklődés forrása TypeLoadException) |
| Source |
Lekéri vagy beállítja az alkalmazás vagy a hibát okozó objektum nevét. (Öröklődés forrása Exception) |
| StackTrace |
Lekéri a hívásverem közvetlen kereteinek sztringképét. (Öröklődés forrása Exception) |
| TargetSite |
Lekéri az aktuális kivételt okozó metódust. (Öröklődés forrása Exception) |
| TypeName |
Lekéri a kivételt okozó típus teljes nevét. (Öröklődés forrása TypeLoadException) |
Metódusok
| Név | Description |
|---|---|
| Equals(Object) |
Meghatározza, hogy a megadott objektum egyenlő-e az aktuális objektummal. (Öröklődés forrása Object) |
| GetBaseException() |
Ha egy származtatott osztály felül van bírálva, egy Exception vagy több későbbi kivétel kiváltó okát adja vissza. (Öröklődés forrása Exception) |
| GetHashCode() |
Ez az alapértelmezett kivonatoló függvény. (Öröklődés forrása Object) |
| GetObjectData(SerializationInfo, StreamingContext) |
Elavult.
Beállítja az SerializationInfo objektumot az osztály nevével, a metódus nevével, az erőforrás-azonosítóval és a további kivételadatokkal. (Öröklődés forrása TypeLoadException) |
| GetType() |
Lekéri az aktuális példány futtatókörnyezeti típusát. (Öröklődés forrása Exception) |
| MemberwiseClone() |
Az aktuális Objectpéldány sekély másolatát hozza létre. (Öröklődés forrása Object) |
| ToString() |
Létrehozza és visszaadja az aktuális kivétel sztring-ábrázolását. (Öröklődés forrása Exception) |
esemény
| Név | Description |
|---|---|
| SerializeObjectState |
Elavult.
Akkor fordul elő, ha a kivétel szerializálva van egy kivételállapot-objektum létrehozásához, amely szerializált adatokat tartalmaz a kivételről. (Öröklődés forrása Exception) |