EntryPointNotFoundException Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Wyjątek zgłaszany podczas próby załadowania klasy kończy się niepowodzeniem z powodu braku metody wprowadzania.
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
- Dziedziczenie
- Atrybuty
Uwagi
Wyjątek EntryPointNotFoundException jest zgłaszany, gdy środowisko uruchomieniowe języka wspólnego nie może załadować zestawu, ponieważ nie może zidentyfikować punktu wejścia zestawu. Ten wyjątek można zgłosić w następujących warunkach:
Środowisko uruchomieniowe języka wspólnego nie może zlokalizować punktu wejścia aplikacji (zazwyczaj
Main
metody) w zestawie wykonywalnym. Punkt wejścia aplikacji musi być globalną lubstatic
metodą, która nie ma parametrów ani tablicy ciągów jako jedynego parametru. Punkt wejścia może zwrócićvoid
wartość lub może zwrócić Int32 kod zakończenia lub UInt32 . Zestaw aplikacji nie może zdefiniować więcej niż jednego punktu wejścia.Nie można rozpoznać wywołania funkcji w bibliotece DLL systemu Windows, ponieważ nie można odnaleźć funkcji. W poniższym przykładzie zgłaszany jest wyjątek, EntryPointNotFoundException ponieważ User32.dll nie zawiera funkcji o nazwie
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'.
Nie można rozpoznać wywołania funkcji w bibliotece DLL systemu Windows, ponieważ nazwa użyta w wywołaniu metody jest niezgodna z nazwą znalezioną w zestawie. Często dzieje się tak, ponieważ DllImportAttribute.ExactSpelling pole jest niejawnie lub jawnie ustawione na
true
, wywołana metoda zawiera co najmniej jeden parametr ciągu i ma wersję ANSI i Unicode, a nazwa używana w wywołaniu metody nie odpowiada nazwie tej wersji ANSI lub Unicode. Poniższy przykład przedstawia ilustrację, próbując wywołać funkcję systemu WindowsMessageBox
w User32.dll. Ponieważ pierwsza definicja metody określa CharSet.Unicode marshaling ciągów, język wspólny wyszukuje wersję funkcji o szerokim znaku,MessageBoxW
zamiast nazwy używanej w wywołaniuMessageBox
metody . Druga definicja metody naprawia ten problem, wywołującMessageBoxW
funkcję zamiastMessageBox
funkcji .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
Próbujesz wywołać funkcję w bibliotece linków dynamicznych przy użyciu prostej nazwy, a nie jej nazwy ozdobionej. Zazwyczaj kompilator języka C++ generuje dekorowaną nazwę funkcji DLL. Na przykład poniższy kod C++ definiuje funkcję o nazwie
Double
w bibliotece o nazwie TestDll.dll.__declspec(dllexport) int Double(int number) { return number * 2; }
Gdy kod w poniższym przykładzie próbuje wywołać funkcję, zgłaszany jest wyjątek, EntryPointNotFoundException ponieważ
Double
nie można odnaleźć funkcji.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()
Jeśli jednak funkcja jest wywoływana przy użyciu jej nazwy ozdobionej (w tym przypadku
?Double@@YAHH@Z
), wywołanie funkcji powiedzie się, jak pokazano w poniższym przykładzie.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
Nazwy funkcji wyeksportowanych przez bibliotekę DLL można znaleźć przy użyciu narzędzia takiego jak Dumpbin.exe.
Próbujesz wywołać metodę w zestawie zarządzanym tak, jakby była to niezarządzana biblioteka linków dynamicznych. Aby zobaczyć to w akcji, skompiluj poniższy przykład do zestawu o nazwie 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
Następnie skompiluj i wykonaj poniższy przykład, który próbuje wywołać metodę
StringUtilities.SayGoodMorning
w bibliotece linków dynamicznych StringUtilities.dll tak, jakby był to kod niezarządzany. Wynik jest EntryPointNotFoundException wyjątkiem.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()
Aby wyeliminować wyjątek, dodaj odwołanie do zestawu zarządzanego i uzyskaj dostęp do
StringUtilities.SayGoodMorning
metody tak samo, jak w przypadku każdej innej metody w kodzie zarządzanym, jak w poniższym przykładzie.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!
Próbujesz wywołać metodę w dll COM tak, jakby była to biblioteka DLL systemu Windows. Aby uzyskać dostęp do biblioteki DLL MODELU COM, wybierz opcję Dodaj odwołanie w programie Visual Studio, aby dodać odwołanie do projektu, a następnie wybierz bibliotekę typów z karty COM .
Aby uzyskać listę początkowych wartości właściwości dla wystąpienia EntryPointNotFoundExceptionklasy , zobacz EntryPointNotFoundException konstruktory.
Konstruktory
EntryPointNotFoundException() |
Inicjuje nowe wystąpienie klasy EntryPointNotFoundException. |
EntryPointNotFoundException(SerializationInfo, StreamingContext) |
Przestarzałe.
Inicjuje nowe wystąpienie klasy EntryPointNotFoundException z zserializowanymi danymi. |
EntryPointNotFoundException(String) |
Inicjuje EntryPointNotFoundException nowe wystąpienie klasy z określonym komunikatem o błędzie. |
EntryPointNotFoundException(String, Exception) |
Inicjuje nowe wystąpienie EntryPointNotFoundException klasy z określonym komunikatem o błędzie i odwołaniem do wyjątku wewnętrznego, który jest przyczyną tego wyjątku. |
Właściwości
Data |
Pobiera kolekcję par klucz/wartość, które zapewniają dodatkowe informacje zdefiniowane przez użytkownika dotyczące wyjątku. (Odziedziczone po Exception) |
HelpLink |
Pobiera lub ustawia link do pliku pomocy skojarzonego z tym wyjątkiem. (Odziedziczone po Exception) |
HResult |
Pobiera lub ustawia HRESULT, zakodowaną wartość liczbową przypisaną do określonego wyjątku. (Odziedziczone po Exception) |
InnerException |
Exception Pobiera wystąpienie, które spowodowało bieżący wyjątek. (Odziedziczone po Exception) |
Message |
Pobiera komunikat o błędzie dla tego wyjątku. (Odziedziczone po TypeLoadException) |
Source |
Pobiera lub ustawia nazwę aplikacji lub obiektu, który powoduje błąd. (Odziedziczone po Exception) |
StackTrace |
Pobiera reprezentację ciągu natychmiastowych ramek na stosie wywołań. (Odziedziczone po Exception) |
TargetSite |
Pobiera metodę, która zgłasza bieżący wyjątek. (Odziedziczone po Exception) |
TypeName |
Pobiera w pełni kwalifikowaną nazwę typu, który powoduje wyjątek. (Odziedziczone po TypeLoadException) |
Metody
Equals(Object) |
Określa, czy dany obiekt jest taki sam, jak bieżący obiekt. (Odziedziczone po Object) |
GetBaseException() |
Po przesłonięciu w klasie pochodnej funkcja zwraca Exception główną przyczynę co najmniej jednego kolejnego wyjątku. (Odziedziczone po Exception) |
GetHashCode() |
Służy jako domyślna funkcja skrótu. (Odziedziczone po Object) |
GetObjectData(SerializationInfo, StreamingContext) |
Przestarzałe.
SerializationInfo Ustawia obiekt z nazwą klasy, nazwą metody, identyfikatorem zasobu i dodatkowymi informacjami o wyjątku. (Odziedziczone po TypeLoadException) |
GetType() |
Pobiera typ środowiska uruchomieniowego bieżącego wystąpienia. (Odziedziczone po Exception) |
MemberwiseClone() |
Tworzy płytkią kopię bieżącego Objectelementu . (Odziedziczone po Object) |
ToString() |
Tworzy i zwraca reprezentację ciągu bieżącego wyjątku. (Odziedziczone po Exception) |
Zdarzenia
SerializeObjectState |
Przestarzałe.
Występuje, gdy wyjątek jest serializowany w celu utworzenia obiektu stanu wyjątku, który zawiera serializowane dane dotyczące wyjątku. (Odziedziczone po Exception) |