Использование неуправляемых функций DLL
Вызов неуправляемого кода — это служба, позволяющая управляемому коду вызывать неуправляемые функции, реализованные в библиотеках динамической компоновки (DLL), например функции библиотек API Windows. Он обнаруживает и вызывает экспортированную функцию и при необходимости маршалирует ее аргументы (целые числа, строки, массивы, структуры и так далее) через границы взаимодействия.
В этом разделе описаны задачи, связанные с использованием неуправляемых функций DLL, и предоставляются дополнительные сведения о вызове неуправляемого кода. Кроме того, раздел содержит общие сведения и ссылки на дополнительную информацию и примеры.
Использование экспортированных функций DLL
Идентификация функций в библиотеках DLL.
Как минимум, необходимо указать имя функции и имя библиотеки DLL, содержащей ее.
Создание класса, содержащего функции DLL.
Можно использовать существующий класс, создать отдельный класс для каждой неуправляемой функции или создать один класс, содержащий набор связанных неуправляемых функций.
Создание прототипов в управляемом коде.
[Visual Basic] Используйте оператор Declare с ключевыми словами Function и Lib. В редких случаях можно использовать атрибут DllImportAttribute с ключевыми словами Shared Function. Такие случаи рассматриваются далее в этом разделе.
[C#] Используйте атрибут DllImportAttribute для идентификации библиотеки DLL и функции. Пометьте метод модификаторами static и extern.
[C++] Используйте атрибут DllImportAttribute для идентификации библиотеки DLL и функции. Пометьте метод или функцию оболочки модификатором extern "C".
-
Вызовите метод управляемого класса так же, как и любой другой управляемый метод. Передача структур и реализация функций обратного вызова представляют собой особые случаи.
Примеры, демонстрирующие создание. Объявления на основе NET для использования с вызовом платформы см. в разделе "Маршаллирование данных с помощью вызова платформы".
Подробный обзор вызова неуправляемого кода
Вызов неуправляемого кода использует метаданные для нахождения экспортированных функций и маршалинга их аргументов во время выполнения. На следующем рисунке показан этот процесс.
Когда неуправляемый код вызывает неуправляемую функцию, то он выполняет следующую последовательность действий:
Определяет библиотеку DLL, содержащую функцию.
Загружает библиотеку DLL в память.
Находит адрес функции в памяти и отправляет свои аргументы в стек, маршалируя данные по мере необходимости.
Примечание.
Поиск и загрузка библиотеки DLL, а также определение адреса функции в памяти выполняются только при первом вызове функции.
Передает управление неуправляемой функции.
Вызов неуправляемого кода вызывает исключения, создаваемые неуправляемой функцией для управляемого вызывающего объекта.