Прочитать на английском

Поделиться через


EntryPointNotFoundException Класс

Определение

Исключение, выбрасываемое, когда попытка загрузки класса завершается неудачей из-за отсутствия метода входа.

public class EntryPointNotFoundException : TypeLoadException
[System.Serializable]
public class EntryPointNotFoundException : TypeLoadException
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class EntryPointNotFoundException : TypeLoadException
Наследование
EntryPointNotFoundException
Атрибуты

Комментарии

Исключение 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'.
    
  • Не удается разрешить вызов функции в библиотеке DLL Windows, так как имя, используемое в вызове метода, не совпадает с именем, найденным в сборке. Часто это происходит из-за того, что DllImportAttribute.ExactSpelling для поля неявно или явно задано значение true, вызываемый метод включает один или несколько строковых параметров и имеет версию ANSI и Юникод, а имя, используемое в вызове метода, не соответствует имени этой версии ANSI или Юникода. В следующем примере показана попытка вызвать функцию Windows MessageBox в 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);
          }
       }
    }
    
  • Вы пытаетесь вызвать функцию в библиотеке динамической компоновки по простому имени, а не по декорированному имени. Как правило, компилятор 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()
    

    Однако если функция вызывается с использованием ее декорированного имени (в данном случае ?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
    

    Вы можете найти декорированные имена функций, экспортированных библиотекой 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);
       }
    }
    

    Затем скомпилируйте и выполните следующий пример, который пытается вызвать 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()
    

    Чтобы устранить исключение, добавьте ссылку на управляемую сборку и получите доступ к методу 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!
    
  • Вы пытаетесь вызвать метод в библиотеке 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)

Применяется к

Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

См. также раздел