EntryPointNotFoundException Clase
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Excepción que se produce cuando se produce un error al intentar cargar una clase debido a la ausencia de un método de entrada.
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
- Herencia
- Atributos
Comentarios
Se produce una EntryPointNotFoundException excepción cuando Common Language Runtime no puede cargar un ensamblado porque no puede identificar el punto de entrada del ensamblado. Esta excepción se puede producir en las siguientes condiciones:
Common Language Runtime no puede encontrar un punto de entrada de aplicación (normalmente un
Main
método) en un ensamblado ejecutable. El punto de entrada de la aplicación debe ser un método ostatic
global que no tenga parámetros ni una matriz de cadenas como único parámetro. El punto de entrada puede devolvervoid
o puede devolver un Int32 código de salida o UInt32 . Un ensamblado de aplicación no puede definir más de un punto de entrada.No se puede resolver la llamada a una función de un archivo DLL de Windows porque no se encuentra la función. En el ejemplo siguiente, se produce una EntryPointNotFoundException excepción porque User32.dll no incluye una función denominada
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'.
No se puede resolver la llamada a una función de un archivo DLL de Windows porque el nombre usado en la llamada al método no coincide con un nombre encontrado en el ensamblado. Con frecuencia, esto ocurre porque el DllImportAttribute.ExactSpelling campo se establece
true
implícita o explícitamente en , el método llamado incluye uno o más parámetros de cadena y tiene tanto una versión ANSI como una versión Unicode, y el nombre usado en la llamada al método no corresponde al nombre de esta versión ANSI o Unicode. En el ejemplo siguiente se proporciona una ilustración al intentar llamar a la función de WindowsMessageBox
en User32.dll. Dado que la primera definición de método especifica las referencias de cadena, el lenguaje común busca la versión de caracteres anchos CharSet.Unicode de la función, ,MessageBoxW
en lugar del nombre usado en la llamada al método ,MessageBox
. La segunda definición del método corrige este problema llamando a enMessageBoxW
lugar de laMessageBox
función .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
Está intentando llamar a una función en una biblioteca de vínculos dinámicos por su nombre simple en lugar de su nombre decorado. Normalmente, el compilador de C++ genera un nombre decorado para las funciones DLL. Por ejemplo, el código de C++ siguiente define una función denominada
Double
en una biblioteca denominada TestDll.dll.__declspec(dllexport) int Double(int number) { return number * 2; }
Cuando el código del ejemplo siguiente intenta llamar a la función, se produce una EntryPointNotFoundException excepción porque no se encuentra la
Double
función.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()
Sin embargo, si se llama a la función mediante su nombre decorado (en este caso,
?Double@@YAHH@Z
), la llamada de función se realiza correctamente, como se muestra en el ejemplo siguiente.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
Puede encontrar los nombres representativos de las funciones exportadas por un archivo DLL mediante una utilidad como Dumpbin.exe.
Está intentando llamar a un método en un ensamblado administrado como si fuera una biblioteca de vínculos dinámicos no administrada. Para ver esto en acción, compile el ejemplo siguiente en un ensamblado denominado 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
A continuación, compile y ejecute el ejemplo siguiente, que intenta llamar al
StringUtilities.SayGoodMorning
método en la biblioteca de vínculos dinámicos StringUtilities.dll como si fuera código no administrado. El resultado es una EntryPointNotFoundException excepción.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()
Para eliminar la excepción, agregue una referencia al ensamblado administrado y acceda al
StringUtilities.SayGoodMorning
método igual que tendría que tener acceso a cualquier otro método en código administrado, como en el ejemplo siguiente.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!
Está intentando llamar a un método en un archivo DLL COM como si fuera un archivo DLL de Windows. Para acceder a un archivo DLL COM, seleccione la opción Agregar referencia en Visual Studio para agregar una referencia al proyecto y, a continuación, seleccione la biblioteca de tipos en la pestaña COM .
Para obtener una lista de valores de propiedad iniciales de una instancia de EntryPointNotFoundException, consulte el EntryPointNotFoundException constructores.
Constructores
EntryPointNotFoundException() |
Inicializa una nueva instancia de la clase EntryPointNotFoundException. |
EntryPointNotFoundException(SerializationInfo, StreamingContext) |
Obsoletos.
Inicializa una nueva instancia de la clase EntryPointNotFoundException con datos serializados. |
EntryPointNotFoundException(String) |
Inicializa una nueva instancia de la clase EntryPointNotFoundException con el mensaje de error especificado. |
EntryPointNotFoundException(String, Exception) |
Inicializa una nueva instancia de la clase EntryPointNotFoundException con el mensaje de error especificado y una referencia a la excepción interna que representa la causa de esta excepción. |
Propiedades
Data |
Obtiene una colección de pares clave/valor que proporciona información definida por el usuario adicional sobre la excepción. (Heredado de Exception) |
HelpLink |
Obtiene o establece un vínculo al archivo de ayuda asociado a esta excepción. (Heredado de Exception) |
HResult |
Obtiene o establece HRESULT, un valor numérico codificado que se asigna a una excepción específica. (Heredado de Exception) |
InnerException |
Obtiene la instancia Exception que produjo la excepción actual. (Heredado de Exception) |
Message |
Obtiene el mensaje de error para esta excepción. (Heredado de TypeLoadException) |
Source |
Devuelve o establece el nombre de la aplicación o del objeto que generó el error. (Heredado de Exception) |
StackTrace |
Obtiene una representación de cadena de los marcos inmediatos en la pila de llamadas. (Heredado de Exception) |
TargetSite |
Obtiene el método que produjo la excepción actual. (Heredado de Exception) |
TypeName |
Obtiene el nombre completo del tipo que genera la excepción. (Heredado de TypeLoadException) |
Métodos
Equals(Object) |
Determina si el objeto especificado es igual que el objeto actual. (Heredado de Object) |
GetBaseException() |
Cuando se invalida en una clase derivada, devuelve la clase Exception que representa la causa principal de una o más excepciones posteriores. (Heredado de Exception) |
GetHashCode() |
Sirve como la función hash predeterminada. (Heredado de Object) |
GetObjectData(SerializationInfo, StreamingContext) |
Obsoletos.
Establece el objeto SerializationInfo con el nombre de la clase, el nombre del método, el id. de recurso y la información adicional de la excepción. (Heredado de TypeLoadException) |
GetType() |
Obtiene el tipo de tiempo de ejecución de la instancia actual. (Heredado de Exception) |
MemberwiseClone() |
Crea una copia superficial del Object actual. (Heredado de Object) |
ToString() |
Crea y devuelve una representación de cadena de la excepción actual. (Heredado de Exception) |
Eventos
SerializeObjectState |
Obsoletos.
Ocurre cuando una excepción se serializa para crear un objeto de estado de excepción que contenga datos serializados sobre la excepción. (Heredado de Exception) |