Общие сведения о маршалинге
Обновлен: Ноябрь 2007
.NET Compact Framework, версия 2.0 обеспечивает расширенный маршалинг посредством IDispatch и вызовов неуправляемого кода и виртуальной таблицы (vtable). Данная поддержка включает следующее:
Использование атрибута MarshalAsAttribute.
Маршалинг типов variant, которые поддерживаются в приложении Windows Embedded CE.
Маршалинг типов, которые вызывают интерфейсы COM посредством виртуальной таблицы (vtable).
Маршалинг структур с внедренными массивами и строками.
Определение макета структуры
Можно маршалировать следующие типы по значению или ссылке:
BStr
IUnknown
IDispatch
SafeArray
DateTime (маршалирован как OLE DATE)
Variant
Обратите внимание, что .NET Compact Framework 2.0 поддерживает методы AllocHGlobal и FreeHGlobal.
Журнал взаимодействия
Можно создать файлы журнала подписей функций, чтобы видеть, как маршалируется вызов взаимодействия. Дополнительные сведения о создании таких файлов см. в разделе Пошаговое руководство. Создание файла журнала. Дополнительные сведения об интерпретации файлов журнала см. в разделе Сведения файла журнала.
Отличия от маршалинга в полной версии .NET Framework
.NET Compact Framework не поддерживает следующие средства маршалинга и взаимодействия полной версии .NET Framework:
Настраиваемый маршалинг.
Получение управляемого делегата из указателя собственной функции с помощью метода GetDelegateForFunctionPointer. Тем не менее можно создать указатель собственной функции из управляемого делегата.
Доступ к классам .NET Compact Framework из собственных компонентов.
Передача структур (VT_RECORD) с помощью IDispatch.
Передача типов Int64 и UInt64 с помощью IDispatch.
.NET Compact Framework отличается от полной версии .NET Framework в следующих поведениях маршалинга:
.NET Compact Framework, в отличие от полной версии .NET Framework, разрешает маршалинг массивов значений SCODE.
.NET Compact Framework выполняет маршалинг массивов указателей IUnknown и Idispatch иначе, чем полная версия .NET Framework.
.NET Compact Framework инициализирует все потоки как многопотоковые подразделения и не поддерживает другие потоковые модели или настройку модели контейнера. Следовательно, .NET Compact Framework не поддерживает свойство ApartmentState или следующие методы:
Маршалинг с помощью оператора Declare Visual Basic
Оператор Declare Visual Basic является альтернативой ссылок declare на внешние процедуры в DLL. Обратите внимание, что ключевое слово Ansi в операторе Declare не поддерживается.
Маршалинг с помощью оператора Declare идентичен маршалингу с помощью класса DllImportAttribute, кроме объектов ByVal String. В операторе Declare параметр ByVal String маршалируется как выходной параметр. Так как строки не подлежат изменению, среда CLR копирует строку и возвращает новую ссылку.
Различия между модулями маршалера IDispatch и неуправляемого кода
В следующей таблице показаны типы, которые по-разному маршалируются двумя модулями маршелера.
Тип |
IDispatch |
Вызов неуправляемого кода и виртуальная таблица |
---|---|---|
BStr |
wchar* |
|
Variant |
NULL |
|
VARIANT_BOOL |
byte |
|
SafeArray |
Массив стиля C |
.NET Compact Framework выполняет маршалирование класса посредством вызова неуправляемого кода без StructLayoutAttribute как структуру автомакета; полная версия .NET Framework маршалирует класс как вызываемую оболочку COM (CCW).
Обратите внимание, что .NET Compact Framework помечает указатель SafeArray как FADF_FIXEDSIZE и вызывает исключение, если будет изменен его размер в машинном коде.
В ситуациях, когда Boolean преобразуется в машинный тип byte, невозможно маршалировать Boolean как возвращаемый тип; его можно маршалировать только как аргумент.
Маршалинг делегатов
По умолчанию делегаты маршалируются как указатели функций. Можно явно использовать значение FunctionPtr из перечисления UnmanagedType для создания экземпляра MarshalAsAttribute. Примеры см. в разделе Маршалинг делегатов как указателей на функции.
Определение набора знаков
Чтобы определить набор знаков при маршалинге строк с помощью вызова неуправляемого кода, можно использовать поле CharSet объекта DllImportAttribute.
.NET Compact Framework поддерживает следующие значения:
Auto. Строки маршалируются с помощью соответствующего набора знаков операционной системы, который является набором символов Юникод. Это значение по умолчанию.
Unicode. Строки маршалируются с помощью набора символов Юникод.
Значение Ansi не поддерживается, так как Windows Embedded CE является только кодировкой Юникод. Значение None эквивалентно Ansi и не поддерживается.
Так как .NET Compact Framework не поддерживает поле ExactSpelling, общеязыковая среда выполнения автоматически ищет точку входа соответственно значению, указанному в поле CharSet.
Закрепление объекта
Когда общеязыковая среда платформы .NET Compact Framework маршалирует объект, он закрепляется на время вызова неуправляемого кода, чтобы сборщик мусора не удалил или не переместил его.
Использование памяти
Используйте следующие рекомендации для обработки памяти с помощью неуправляемого кода в .NET Compact Framework:
Всегда выделяйте память в управляемом коде и передавайте ее в неуправляемый код.
Если неуправляемый код содержит указатель на управляемый компонент, необходимо вручную закрепить объект с помощью структуры GCHandle.
Среда CLR .NET Compact Framework коинициализирует потоки при запуске и при их завершении. Потоки помечаются как "свободные потоки".
См. также
Задачи
Пошаговое руководство. Создание файла журнала