Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Если стандартное поведение маршаллинга параметров среды выполнения .NET не соответствует вашим требованиям, используйте атрибут System.Runtime.InteropServices.MarshalAsAttribute, чтобы настроить, как ваши параметры маршалируются. Эти функции настройки не применяются при отключении маршаллинга среды выполнения.
Замечание
Созданный источником взаимодействие для P/Invokes и COM учитывает только небольшое подмножество MarshalAsAttribute параметров. Вместо этого рекомендуется использовать MarshalUsingAttribute для программной совместимости, созданной на основе исходного кода. Более подробную информацию см. в разделе Настраиваемое маршалирование для генерации исходного кода.
Настройка параметров строки
.NET имеет различные форматы для управления строками. Эти методы разделены на отдельные разделы по строкам стиля C и форматам строк, зависящим от Windows.
Строки в стиле C
Каждый из этих форматов передает строку, завершаемую null, в машинный код. Они отличаются кодировкой собственной строки.
Значение System.Runtime.InteropServices.UnmanagedType |
Кодировка |
|---|---|
| LPStr | ANSI (Американский национальный институт стандартов) |
| LPUTF8Str | UTF-8 |
| LPWStr | UTF-16 |
| LPTStr | UTF-16 |
Формат UnmanagedType.VBByRefStr немного отличается. Например LPWStr, он маршалирует строку в собственную строку в стиле C, закодированную в UTF-16. Однако, управляемая сигнатура функции требует передачи строки по ссылке, в то время как соответствующая нативная сигнатура функции принимает строку по значению. Это различие позволяет использовать встроенный API, который принимает строку как значение и модифицирует её на месте без необходимости использования StringBuilder. Не рекомендуется вручную использовать этот формат, так как он может привести к путанице из-за несоответствия собственных и управляемых подписей.
Форматы строк, ориентированные на Windows
При взаимодействии с интерфейсами COM или OLE, скорее всего, вы обнаружите, что собственные функции принимают строки в качестве BSTR аргументов. Для маршалинга строки в виде BSTRнеуправляемого типа можно использоватьUnmanagedType.BStr.
Если вы взаимодействуете с API WinRT, можно использовать формат UnmanagedType.HString, чтобы маршалить строку как HSTRING.
Настройка параметров массива
.NET также предлагает несколько способов для маршалирования параметров массива. Если вы вызываете API, принимающего массив стилей C, используйте неуправляемый UnmanagedType.LPArray тип. Если значения в массиве нуждаются в настраиваемом маршалинге, можно использовать поле ArraySubType в атрибуте [MarshalAs] для этого.
Если вы используете COM API, скорее всего, придется маршалировать параметры массива как SAFEARRAY*s. Для этого можно использовать неуправляемый UnmanagedType.SafeArray тип. Тип элементов SAFEARRAY по умолчанию можно увидеть в таблице по настройке object полей. Вы можете использовать поля MarshalAsAttribute.SafeArraySubType и MarshalAsAttribute.SafeArrayUserDefinedSubType для настройки точного типа элемента SAFEARRAY.
Настройка логических или десятичных параметров
Сведения о маршалинге логических или десятичных параметров см. в разделе "Настройка маршалинга структуры".
Настройка параметров объекта (только для Windows)
На Windows исполняющая среда .NET предоставляет несколько различных способов маршалирования параметров объекта в нативный код.
Маршаллирование в виде определенных COM-интерфейсов
Если ваш API принимает указатель на COM-объект, вы можете использовать любой из следующих UnmanagedType форматов в object-типизированном параметре, чтобы сообщить .NET маршалировать как конкретные интерфейсы.
IUnknownIDispatchIInspectable
Кроме того, если ваш тип помечен как [ComVisible(true)] или если вы передаете тип object, вы можете использовать формат UnmanagedType.Interface для маршалирования вашего объекта в качестве вызываемой COM-оболочки для представления типа в COM.
Маршаллинг в VARIANT
Если ваш собственный API принимает Win32 VARIANT, вы можете использовать формат UnmanagedType.Struct на параметре object для маршалинга ваших объектов как VARIANT. См. документацию по настройке object полей для сопоставления типов и VARIANT типов .NET.
Пользовательские маршаллеры
Если вы хотите проецировать собственный COM-интерфейс в другой управляемый тип, можно использовать UnmanagedType.CustomMarshaler формат и реализацию ICustomMarshaler для предоставления пользовательского кода маршалинга.