Задание точки входа

Точка входа определяет расположение функции в DLL. В управляемом проекте исходное имя или порядковый номер точки входа целевой функции определяет эту функцию в границах взаимодействия. Также разработчик может сопоставить точку входа с другим именем, фактически переименовывая функцию.

Ниже приведен перечень возможных причин переименования функции DLL:

  • избежать использования имен API-функций, чувствительных к регистру знаков;

  • привести имена в соответствие с существующими стандартами именования;

  • сделать возможным вызов функций, принимающих данные разных типов (объявляя несколько версий одной и той же функции DLL);

  • упростить применение API-интерфейсов, которые содержат функции версий для ANSI и Юникода.

В этом разделе показан способ переименования функции DLL в управляемом коде.

Переименование функции в Visual Basic

В Visual Basic для установки поля DllImportAttribute.EntryPoint используется ключевое слово Function в инструкции Declare. В следующем примере показан базовый вариант объявления.

Imports System.Runtime.InteropServices

Public Class Win32
    Declare Auto Function MsgBox Lib "user32.dll" _
       Alias MessageBox (ByVal hWnd As Integer, ByVal txt As String,_
       ByVal caption As String, ByVal Typ As Integer) As Integer
End Class

Как показано в следующем примере, можно заменить точку входа MessageBox на MsgBox, включив в определение ключевое слово Alias. В обоих примерах ключевое слово Auto позволяет не указывать версию кодировки для точки входа. Дополнительные сведения о выборе кодировки см. в разделе Задание кодировки.

Imports System.Runtime.InteropServices

Public Class Win32
    Declare Auto Function MsgBox Lib "user32.dll" _
       Alias MessageBox (ByVal hWnd As Integer, ByVal txt As String,_
       ByVal caption As String, ByVal Typ As Integer) As Integer
End Class

Переименование функции в C# и C++

Для задания функции по имени или порядковому номеру можно использовать поле DllImportAttribute.EntryPoint. Если имя функции в определении метода совпадает с именем точки входа в DLL, явно задавать функцию с помощью поля EntryPoint не требуется. В противном случае, чтобы указать имя или порядковый номер, следует использовать одну из следующих форм атрибута:

[DllImport("dllname", EntryPoint="Functionname")]
[DllImport("dllname", EntryPoint="#123")]

Обратите внимание, что порядковому номеру должен предшествовать знак #.

В следующем примере показан способ замены в программном коде MessageBoxA на MsgBox с помощью поля EntryPoint

using System.Runtime.InteropServices;

public class Win32 {
    [DllImport("user32.dll", EntryPoint="MessageBoxA")]
    public static extern int MsgBox(int hWnd, String text, String caption,
                                    uint type);
}
using namespace System::Runtime::InteropServices;

typedef void* HWND;
[DllImport("user32", EntryPoint="MessageBoxA")]
extern "C" int MsgBox(HWND hWnd,
                      String*  pText,
                      String*  pCaption,
                      unsigned int uType);

См. также

Ссылки

DllImportAttribute

Основные понятия

Создание прототипов в управляемом коде

Примеры вызовов неуправляемого кода

Другие ресурсы

Маршалинг данных при вызове неуправляемого кода