Использование неуправляемых функций DLLConsuming Unmanaged DLL Functions

Вызов неуправляемого кода — это служба, позволяющая управляемому коду вызывать неуправляемые функции, реализованные в библиотеках динамической компоновки (DLL), например функции библиотек API Windows.Platform invoke is a service that enables managed code to call unmanaged functions implemented in dynamic link libraries (DLLs), such as those in the Windows API. Он обнаруживает и вызывает экспортированную функцию и при необходимости маршалирует ее аргументы (целые числа, строки, массивы, структуры и так далее) через границы взаимодействия.It locates and invokes an exported function and marshals its arguments (integers, strings, arrays, structures, and so on) across the interoperation boundary as needed.

В этом разделе описаны задачи, связанные с использованием неуправляемых функций DLL, и предоставляются дополнительные сведения о вызове неуправляемого кода.This section introduces tasks associated with consuming unmanaged DLL functions and provides more information about platform invoke. Кроме того, раздел содержит общие сведения и ссылки на дополнительную информацию и примеры.In addition to the following tasks, there are general considerations and a link providing additional information and examples.

Использование экспортированных функций DLLTo consume exported DLL functions

  1. Идентификация функций в библиотеках DLL.Identify functions in DLLs.

    Как минимум, необходимо указать имя функции и имя библиотеки DLL, содержащей ее.Minimally, you must specify the name of the function and name of the DLL that contains it.

  2. Создание класса, содержащего функции DLL.Create a class to hold DLL functions.

    Можно использовать существующий класс, создать отдельный класс для каждой неуправляемой функции или создать один класс, содержащий набор связанных неуправляемых функций.You can use an existing class, create an individual class for each unmanaged function, or create one class that contains a set of related unmanaged functions.

  3. Создание прототипов в управляемом коде.Create prototypes in managed code.

    [Visual Basic] Используйте оператор Declare с ключевыми словами Function и Lib.[Visual Basic] Use the Declare statement with the Function and Lib keywords. В редких случаях можно использовать атрибут DllImportAttribute с ключевыми словами Shared Function.In some rare cases, you can use the DllImportAttribute with the Shared Function keywords. Такие случаи рассматриваются далее в этом разделе.These cases are explained later in this section.

    [C#] Используйте атрибут DllImportAttribute для идентификации библиотеки DLL и функции.[C#] Use the DllImportAttribute to identify the DLL and function. Пометьте метод модификаторами static и extern.Mark the method with the static and extern modifiers.

    [C++] Используйте атрибут DllImportAttribute для идентификации библиотеки DLL и функции.[C++] Use the DllImportAttribute to identify the DLL and function. Пометьте метод или функцию оболочки модификатором extern "C".Mark the wrapper method or function with extern "C".

  4. Вызов функции DLL.Call a DLL function.

    Вызовите метод управляемого класса так же, как и любой другой управляемый метод.Call the method on your managed class as you would any other managed method. Передача структур и реализация функций обратного вызова представляют собой особые случаи.Passing structures and implementing callback functions are special cases.

Примеры, демонстрирующие создание объявлений на основе .NET, которые используются с вызовом неуправляемого кода, см. в разделе Маршалинг данных при вызове неуправляемого кода.For examples that demonstrate how to construct .NET-based declarations to be used with platform invoke, see Marshaling Data with Platform Invoke.

Подробный обзор вызова неуправляемого кодаA closer look at platform invoke

Вызов неуправляемого кода использует метаданные для нахождения экспортированных функций и маршалинга их аргументов во время выполнения.Platform invoke relies on metadata to locate exported functions and marshal their arguments at run time. Данный процесс показан на следующем рисунке.The following illustration shows this process.

Схема, показывающая вызов неуправляемого кода.

Когда неуправляемый код вызывает неуправляемую функцию, то он выполняет следующую последовательность действий:When platform invoke calls an unmanaged function, it performs the following sequence of actions:

  1. Определяет библиотеку DLL, содержащую функцию.Locates the DLL containing the function.

  2. Загружает библиотеку DLL в память.Loads the DLL into memory.

  3. Находит адрес функции в памяти и помещает ее аргументы в стек, выполнив по необходимости маршалинг данных.Locates the address of the function in memory and pushes its arguments onto the stack, marshaling data as required.

    Примечание

    Поиск и загрузка библиотеки DLL, а также определение адреса функции в памяти выполняются только при первом вызове функции.Locating and loading the DLL, and locating the address of the function in memory occur only on the first call to the function.

  4. Передает управление неуправляемой функции.Transfers control to the unmanaged function.

Вызов неуправляемого кода вызывает исключения, создаваемые неуправляемой функцией для управляемого вызывающего объекта.Platform invoke throws exceptions generated by the unmanaged function to the managed caller.

См. такжеSee also