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


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

Обновлен: Ноябрь 2007

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

  • Объявлять различные типы

  • Использовать доступные атрибуты для изменения поведения по умолчанию

  • Использовать методы типа Marshal

  • Определять, какие аспекты сборки мусора и работы с полями могут влиять на результаты.

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

В этих примерах содержится следующая структура каталогов:

Каталог

Содержимое

WinAPI

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

WinAPIs\CS

Источники, написанные на языке C#

WinAPIs\VB

Источники, написанные на языке Visual Basic

Custom

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

Custom\CS

Источники, написанные на языке C#

Custom\LIB

Источник библиотеки пользовательского типа

Custom\VB

Источники, написанные на языке VB

Дополнительные сведения об использовании примеров см. в следующих разделах:

Download sample

Построение примеров с использованием командной строки

  1. Откройте окно командной строки и перейдите к вложенной папке, соответствующей выбранному языку.

  2. В командной строке введите msbuild [имя файла].sln.

    8bbftkst.alert_note(ru-ru,VS.90).gifПримечание.

    Примеры пользовательского вызова неуправляемого кода могут быть построены только с использованием Visual Studio.

Построение примеров с использованием Visual Studio

  1. Откройте обозреватель Windows и перейдите вложенной папке, соответствующей выбранному языку.

  2. Дважды щелкните значок [имя файла].sln, чтобы открыть файл в Visual Studio.

  3. В меню Построение выберите команду Построить решение.

Выполнение примеров

  1. Перейдите в одну из вложенных языковых папок каталога WinAPIs или Custom, содержащую построенные исполняемые файлы.

  2. Введите имя исполняемого файла в командной строке.

    8bbftkst.alert_note(ru-ru,VS.90).gifПримечание.

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

Требования

Для работы этих примеров необходимы заголовки 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

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

Ссылки

CharSet

DllImportAttribute

LayoutKind

Marshal

MarshalAsAttribute

StructLayoutAttribute

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

Характеристики маршалинга по умолчанию

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