Пример технологии вызова неуправляемого кода
Обновлен: Ноябрь 2007
В этом примере демонстрируются технологии вызова функций, экспортированных из неуправляемой библиотеки. Он показывает, как:
Объявлять различные типы
Использовать доступные атрибуты для изменения поведения по умолчанию
Использовать методы типа Marshal
Определять, какие аспекты сборки мусора и работы с полями могут влиять на результаты.
В некоторых примерах использованы функции, экспортированные из библиотек Windows, в других используются функции, экспортированные из пользовательской библиотеки. В некоторых примерах использованы библиотеки, которые не доступны для всех платформ Windows или применяются такие способы использования функций, которые поддерживаются не на всех платформах Windows. Однако это не препятствует пониманию указанных правил по вызову неуправляемого кода, которые используются в примере.
В этих примерах содержится следующая структура каталогов:
Каталог |
Содержимое |
---|---|
WinAPI |
Вызов неуправляемого кода, показывающий использование функций, экспортированных из библиотек Windows |
WinAPIs\CS |
Источники, написанные на языке C# |
WinAPIs\VB |
Источники, написанные на языке Visual Basic |
Custom |
Вызов неуправляемого кода, показывающий использование функций, экспортированных из библиотеки пользовательского типа. |
Custom\CS |
Источники, написанные на языке C# |
Custom\LIB |
Источник библиотеки пользовательского типа |
Custom\VB |
Источники, написанные на языке VB |
Дополнительные сведения об использовании примеров см. в следующих разделах:
Построение примеров с использованием командной строки
Откройте окно командной строки и перейдите к вложенной папке, соответствующей выбранному языку.
В командной строке введите msbuild [имя файла].sln.
Примечание.
Примеры пользовательского вызова неуправляемого кода могут быть построены только с использованием Visual Studio.
Построение примеров с использованием Visual Studio
Откройте обозреватель Windows и перейдите вложенной папке, соответствующей выбранному языку.
Дважды щелкните значок [имя файла].sln, чтобы открыть файл в Visual Studio.
В меню Построение выберите команду Построить решение.
Выполнение примеров
Перейдите в одну из вложенных языковых папок каталога WinAPIs или Custom, содержащую построенные исполняемые файлы.
Введите имя исполняемого файла в командной строке.
Примечание.
В данном образце выполняется построение консольных приложений. Чтобы отдельно просмотреть выводимые ими данные, необходимо загрузить их в командной строке.
Требования
Для работы этих примеров необходимы заголовки Windows, которые доступны для проекта, если построение проводилось с помощью Microsoft Visual Studio 2005, Командная строка Visual Studio 2005, или если Платформа SDK установлена и указана в пути поиска включаемых файлов.
Примечания
В следующих таблицах суммированы разделы, показанные в данных образцах, и перечислены расположения исходных файлов для примера или примеров, относящихся к этому разделу.
Практическое руководство. Использование атрибутов вызова неуправляемого кода
Атрибут |
Описание |
Пример |
---|---|---|
EntryPoint |
Переименовывает функцию для использования в управляемом коде. |
WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb |
CharSet |
Выбирает метод маршалирования строк. Также влияет на критерий поиска имени функции. |
WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb |
ExactSpelling |
Показывает, какое имя точки входа в неуправляемом DLL должно быть изменено для взаимодействия со значением CharSet. |
WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb |
CallingConvention |
Вызывает функции с параметрами varargs. |
WinAPIs\CS\Printf.cs WinAPIs\VB\Printf.vb |
PreserveSig |
Изменяет функции, возвращающие HRESULTs. |
WinAPIs\CS\CreateObject.cs WinAPIs\VB\CreateObject.vb |
SetLastError |
Гарантирует сохранение кода ошибки после вызова функции. |
WinAPIs\CS\Errors.cs WinAPIs\VB\Errors.vb |
Маршалирование структур и объединений
Тип |
Описание |
Пример |
---|---|---|
структура ByVal |
Передает структуру в виде параметра In. |
Custom\CS\Structs.cs Custom\VB\Structs.vb |
структура ByRef |
Передает структуру в виде параметра In/Out. |
WinAPIs\CS\OSInfo.cs WinAPIs\VB\OSInfo.vb |
класс ByVal |
Передает класс только с целыми членами в виде параметра In/Out. |
WinAPIs\CS\SysTime.cs WinAPIs\VB\SysTime.vb |
структура с вложенными структурами (выровненная) |
Производит класс, предоставляющий структуру с вложенными структурами на неуправляемой стороне. Структура выравнивается в одну большую структуру на управляемой стороне. |
WinAPIs\CS\FindFile.cs WinAPIs\VB\FindFile.vb |
структура с вложенными структурами (не выровненная) |
Передает структуру с внедренной структурой. |
Custom\CS\Structs.cs Custom\VB\Structs.vb |
структура, содержащая указатель на другую структуру |
Передает структуру, содержащую указатель на другую структуру, выступающую в качестве члена. |
Custom\CS\Structs.cs Custom\VB\Structs.vb |
массив структур, содержащий только целые числа ByVal |
Передает массив структур, содержащих только целые числа, в виде параметра In/Out. |
Custom\CS\Arrays.cs Custom\VB\Arrays.vb |
массив структур, содержащий целые числа и строки ByRef |
Передает массив структур, содержащих целые числа и строки, в виде параметра Out. Вызываемый объект выделяет память для массива. |
Custom\CS\OutArrayOfStructs.cs Custom\VB\OutArrayOfStructs.vb |
союзы с типами значений |
Передает союз с типами значений (целое и двойное). |
Custom\CS\Unions.cs Custom\VB\Unions.vb |
союзы со смешанными типами |
Передает союз со смешанными типами (целое и строковое значение). |
Custom\CS\Unions.cs Custom\VB\Unions.vb |
Маршалирование массива структур
Массив |
Описание |
Пример |
---|---|---|
массив целых чисел ByVal |
Передает массив целочисленных значений в виде параметра In/Out. |
Custom\CS\Arrays.cs Custom\VB\Arrays.vb |
массив целых чисел ByRef |
Передает массив целочисленных значений в виде параметра In/Out. Размер массива может быть изменен. |
Custom\CS\Arrays.cs Custom\VB\Arrays.vb |
2D массив целых чисел ByVal |
Передача матрицы целочисленных значений в виде параметра In/Out. |
Custom\CS\Arrays.cs Custom\VB\Arrays.vb |
Прочее
Тип элемента |
Описание |
Пример |
---|---|---|
HandleRef |
Представляет случай, когда HandleRef следует использовать для предотвращения сбора мусора. |
WinAPIs\CS\HandleRef.cs WinAPIs\VB\HandleRef.vb |
указатели функций |
Передает делегат неуправляемой функции, ожидающей указателя функции. |
Custom\CS\Callback.cs Custom\VB\Callback.vb |
void* |
Вызывает функцию с заданным параметром void*. |
Custom\CS\Void.cs Custom\VB\Void.vb |
LPARAM |
Использует GCHandle для передачи управляемого объекта в неуправляемую функцию, ожидающую тип LPARAM. |
WinAPIs\CS\GCHandle.cs WinAPIs\VB\GCHandle.vb |
Однопотоковое подразделение (STA) и многопотоковое подразделение (MTA) |
Изменяет параметры подразделений по умолчанию, если неуправляемая функция вызывает CoInitialize. |
WinAPIs\CS\ActiveDir.cs WinAPIs\VB\ActiveDir.vb |
Дополнительные сведения о вызове неуправляемого кода см. в комментариях в файлах исходного кода.
См. также
Основные понятия
Использование неуправляемых функций DLL
Примеры вызовов неуправляемого кода