EntryPointNotFoundException Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Исключение, выбрасываемое, когда попытка загрузки класса завершается неудачей из-за отсутствия метода входа.
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
- Наследование
- Атрибуты
Комментарии
Исключение EntryPointNotFoundException возникает, когда общеязыковой среде выполнения не удается загрузить сборку, так как она не может идентифицировать точку входа сборки. Это исключение может быть вызвано при следующих условиях:
Среда CLR не может найти точку входа приложения (обычно это
Main
метод) в исполняемой сборке. Точка входа приложения должна быть глобальной илиstatic
методом, который не имеет параметров или массив строк в качестве единственного параметра. Точка входа может возвращатьvoid
или возвращать Int32 код выхода или UInt32 . Сборка приложения не может определить более одной точки входа.Не удается разрешить вызов функции в библиотеке DLL Windows, так как не удается найти функцию. В следующем примере возникает исключение, EntryPointNotFoundException так как User32.dll не включает функцию с именем
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'.
Не удается разрешить вызов функции в библиотеке DLL Windows, так как имя, используемое в вызове метода, не совпадает с именем, найденным в сборке. Часто это происходит из-за того, что DllImportAttribute.ExactSpelling для поля неявно или явно задано значение
true
, вызываемый метод включает один или несколько строковых параметров и имеет версию ANSI и Юникод, а имя, используемое в вызове метода, не соответствует имени этой версии ANSI или Юникода. В следующем примере показана попытка вызвать функцию WindowsMessageBox
в User32.dll. Так как первое определение метода указывает для маршалинга строк, общий язык ищет версию функции с расширенными символами CharSet.Unicode вместо имени,MessageBoxW
используемого в вызове метода ,MessageBox
. Второе определение метода исправляет эту проблему, вызываяMessageBoxW
вместоMessageBox
функции .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
Вы пытаетесь вызвать функцию в библиотеке динамической компоновки по простому имени, а не по декорированному имени. Как правило, компилятор C++ создает декорированное имя для функций DLL. Например, следующий код C++ определяет функцию с именем
Double
в библиотеке с именем TestDll.dll.__declspec(dllexport) int Double(int number) { return number * 2; }
Когда код в следующем примере пытается вызвать функцию, возникает исключение, EntryPointNotFoundException так как
Double
не удается найти функцию.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()
Однако если функция вызывается с использованием ее декорированного имени (в данном случае
?Double@@YAHH@Z
), вызов функции завершается успешно, как показано в следующем примере.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
Вы можете найти декорированные имена функций, экспортированных библиотекой DLL, с помощью служебной программы, например Dumpbin.exe.
Вы пытаетесь вызвать метод в управляемой сборке, как если бы это была неуправляемая библиотека динамической компоновки. Чтобы увидеть это в действии, скомпилируйте следующий пример в сборку с именем 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
Затем скомпилируйте и выполните следующий пример, который пытается вызвать
StringUtilities.SayGoodMorning
метод в библиотеке динамической компоновки StringUtilities.dll, как если бы это был неуправляемый код. Результатом 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()
Чтобы устранить исключение, добавьте ссылку на управляемую сборку и получите доступ к методу
StringUtilities.SayGoodMorning
так же, как и к любому другому методу в управляемом коде, как показано в следующем примере.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!
Вы пытаетесь вызвать метод в библиотеке COM DLL, как если бы это была библиотека DLL Windows. Чтобы получить доступ к библиотеке DLL COM, выберите параметр Добавить ссылку в Visual Studio, чтобы добавить ссылку на проект, а затем выберите библиотеку типов на вкладке COM .
Список начальных значений свойств для экземпляра EntryPointNotFoundException, см. в разделе EntryPointNotFoundException конструкторы.
Конструкторы
EntryPointNotFoundException() |
Инициализирует новый экземпляр класса EntryPointNotFoundException. |
EntryPointNotFoundException(SerializationInfo, StreamingContext) |
Устаревшие..
Инициализирует новый экземпляр класса EntryPointNotFoundException с сериализованными данными. |
EntryPointNotFoundException(String) |
Инициализирует новый экземпляр класса EntryPointNotFoundException с указанным сообщением об ошибке. |
EntryPointNotFoundException(String, Exception) |
Инициализирует новый экземпляр класса EntryPointNotFoundException указанным сообщением об ошибке и ссылкой на внутреннее исключение, вызвавшее данное исключение. |
Свойства
Data |
Возвращает коллекцию пар «ключ-значение», предоставляющую дополнительные сведения об исключении. (Унаследовано от Exception) |
HelpLink |
Получает или задает ссылку на файл справки, связанный с этим исключением. (Унаследовано от Exception) |
HResult |
Возвращает или задает HRESULT — кодированное числовое значение, присвоенное определенному исключению. (Унаследовано от Exception) |
InnerException |
Возвращает экземпляр класса Exception, который вызвал текущее исключение. (Унаследовано от Exception) |
Message |
Получает сообщение об ошибке для данного исключения. (Унаследовано от TypeLoadException) |
Source |
Возвращает или задает имя приложения или объекта, вызывавшего ошибку. (Унаследовано от Exception) |
StackTrace |
Получает строковое представление непосредственных кадров в стеке вызова. (Унаследовано от Exception) |
TargetSite |
Возвращает метод, создавший текущее исключение. (Унаследовано от Exception) |
TypeName |
Получает полное имя типа, вызвавшего исключение. (Унаследовано от TypeLoadException) |
Методы
Equals(Object) |
Определяет, равен ли указанный объект текущему объекту. (Унаследовано от Object) |
GetBaseException() |
При переопределении в производном классе возвращает исключение Exception, которое является первопричиной одного или нескольких последующих исключений. (Унаследовано от Exception) |
GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
GetObjectData(SerializationInfo, StreamingContext) |
Устаревшие..
Устанавливает объект SerializationInfo с именем класса, именем метода, идентификатором ресурса и дополнительными сведениями об исключении. (Унаследовано от TypeLoadException) |
GetType() |
Возвращает тип среды выполнения текущего экземпляра. (Унаследовано от Exception) |
MemberwiseClone() |
Создает неполную копию текущего объекта Object. (Унаследовано от Object) |
ToString() |
Создает и возвращает строковое представление текущего исключения. (Унаследовано от Exception) |
События
SerializeObjectState |
Устаревшие..
Возникает, когда исключение сериализовано для создания объекта состояния исключения, содержащего сериализованные данные об исключении. (Унаследовано от Exception) |