EntryPointNotFoundException Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Výjimka, která je vyvolán, když pokus o načtení třídy selže kvůli absenci metody zadávání.
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
- Dědičnost
- Atributy
Poznámky
Pokud EntryPointNotFoundException modul CLR (Common Language Runtime) nemůže načíst sestavení, protože nemůže identifikovat vstupní bod sestavení. Tuto výjimku lze vyvolat za následujících podmínek:
Modul CLR (Common Language Runtime) nemůže najít vstupní bod aplikace (obvykle metodu
Main
) ve spustitelném sestavení. Vstupní bod aplikace musí být globální nebostatic
metoda, která jako jediný parametr nemá žádné parametry nebo pole řetězců. Vstupní bod může vrátitvoid
nebo může vrátit Int32UInt32 nebo ukončovací kód. Sestavení aplikace nemůže definovat více než jeden vstupní bod.Volání funkce v knihovně DLL systému Windows nelze přeložit, protože funkci nelze najít. V následujícím příkladu dojde k výjimce EntryPointNotFoundException , protože User32.dll neobsahuje funkci s názvem
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'.
Volání funkce v knihovně DLL systému Windows nelze přeložit, protože název použitý ve volání metody neodpovídá názvu nalezeného v sestavení. Často k tomu dochází, protože DllImportAttribute.ExactSpelling pole je buď implicitně, nebo explicitně nastaveno na
true
, volaná metoda obsahuje jeden nebo více parametrů řetězce a má verzi ANSI i Unicode a název použitý ve volání metody neodpovídá názvu této verze ANSI nebo Unicode. Následující příklad poskytuje obrázek pokusu o volání funkce WindowsMessageBox
v User32.dll. Vzhledem k tomu, že první definice metody určuje CharSet.Unicode zařazování řetězců, hledá běžný jazyk verzi funkce se širokými znaky ,MessageBoxW
místo názvu použitého ve voláníMessageBox
metody . Druhá definice metody tento problém opraví volánímMessageBoxW
funkce místoMessageBox
.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 Module
Pokoušíte se volat funkci v knihovně dynamického propojení pomocí jejího jednoduchého názvu, nikoli podle upraveného názvu. Kompilátor jazyka C++ obvykle generuje dekorovaný název pro funkce knihovny DLL. Například následující kód jazyka C++ definuje funkci s názvem
Double
v knihovně s názvem TestDll.dll.__declspec(dllexport) int Double(int number) { return number * 2; }
Když se kód v následujícím příkladu pokusí volat funkci, vyvolá se výjimka, EntryPointNotFoundException protože
Double
funkci nelze najít.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()
Pokud je však funkce volána pomocí svého upraveného názvu (v tomto případě
?Double@@YAHH@Z
), volání funkce bude úspěšné, jak je znázorněno v následujícím příkladu.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: // 20
open 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: // 20
Module 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
Upravené názvy funkcí exportovaných knihovnou DLL můžete najít pomocí nástroje, jako je například Dumpbin.exe.
Pokoušíte se volat metodu ve spravovaném sestavení, jako by to byla nespravovaná dynamická knihovna. Pokud to chcete vidět v akci, zkompilujte následující příklad do sestavení s názvem 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 Module
Potom zkompilujte a spusťte následující příklad, který se pokusí volat metodu
StringUtilities.SayGoodMorning
v knihovně dynamického propojení StringUtilities.dll, jako by to byl nespravovaný kód. Výsledkem je EntryPointNotFoundException výjimka.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()
Pokud chcete výjimku odstranit, přidejte odkaz na spravované sestavení a přistupujte k
StringUtilities.SayGoodMorning
metodě stejně jako k jakékoli jiné metodě ve spravovaném kódu, jak je tomu v následujícím příkladu.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!
Pokoušíte se volat metodu v knihovně DLL modelu COM, jako by to byla knihovna DLL systému Windows. Chcete-li získat přístup k knihovně DLL modelu COM, vyberte možnost Přidat odkaz v sadě Visual Studio, přidejte odkaz na projekt a pak vyberte knihovnu typů na kartě COM .
Seznam počátečních hodnot vlastností pro instanci najdete v EntryPointNotFoundException konstruktorechEntryPointNotFoundException.
Konstruktory
EntryPointNotFoundException() |
Inicializuje novou instanci EntryPointNotFoundException třídy . |
EntryPointNotFoundException(SerializationInfo, StreamingContext) |
Zastaralé.
Inicializuje novou instanci třídy EntryPointNotFoundException se serializovanými daty. |
EntryPointNotFoundException(String) |
Inicializuje novou instanci EntryPointNotFoundException třídy se zadanou chybovou zprávou. |
EntryPointNotFoundException(String, Exception) |
Inicializuje novou instanci EntryPointNotFoundException třídy se zadanou chybovou zprávou a odkazem na vnitřní výjimku, která je příčinou této výjimky. |
Vlastnosti
Data |
Získá kolekci párů klíč/hodnota, které poskytují další uživatelem definované informace o výjimce. (Zděděno od Exception) |
HelpLink |
Získá nebo nastaví odkaz na soubor nápovědy přidružený k této výjimce. (Zděděno od Exception) |
HResult |
Získá nebo nastaví HRESULT, kódovaná číselná hodnota, která je přiřazena ke konkrétní výjimce. (Zděděno od Exception) |
InnerException |
Exception Získá instanci, která způsobila aktuální výjimku. (Zděděno od Exception) |
Message |
Získá chybovou zprávu pro tuto výjimku. (Zděděno od TypeLoadException) |
Source |
Získá nebo nastaví název aplikace nebo objektu, který způsobuje chybu. (Zděděno od Exception) |
StackTrace |
Získá řetězcovou reprezentaci okamžitých rámců v zásobníku volání. (Zděděno od Exception) |
TargetSite |
Získá metodu, která vyvolá aktuální výjimku. (Zděděno od Exception) |
TypeName |
Získá plně kvalifikovaný název typu, který způsobuje výjimku. (Zděděno od TypeLoadException) |
Metody
Equals(Object) |
Určí, zda se zadaný objekt rovná aktuálnímu objektu. (Zděděno od Object) |
GetBaseException() |
Při přepsání v odvozené třídě vrátí hodnotu Exception , která je původní příčinou jedné nebo více následných výjimek. (Zděděno od Exception) |
GetHashCode() |
Slouží jako výchozí hashovací funkce. (Zděděno od Object) |
GetObjectData(SerializationInfo, StreamingContext) |
Zastaralé.
Nastaví objekt s SerializationInfo názvem třídy, názvem metody, ID prostředku a dalšími informacemi o výjimce. (Zděděno od TypeLoadException) |
GetType() |
Získá typ modulu runtime aktuální instance. (Zděděno od Exception) |
MemberwiseClone() |
Vytvoří mělkou kopii aktuálního Objectsouboru . (Zděděno od Object) |
ToString() |
Vytvoří a vrátí řetězcovou reprezentaci aktuální výjimky. (Zděděno od Exception) |
Událost
SerializeObjectState |
Zastaralé.
Nastane, když je výjimka serializována k vytvoření objektu stavu výjimky, který obsahuje serializovaná data o výjimce. (Zděděno od Exception) |