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


Преобразуемые и непреобразуемые типы

Большинство типов данных используют одинаковое представление как в управляемой, так и в неуправляемой памяти, и не требуют специальной обработки упаковщиком взаимодействия. Такие типы называются непреобразуемыми типами, так как они не требуют преобразования при передаче между управляемым и неуправляемым кодом.

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

Следующие типы из пространства имен System являются непреобразуемыми:

Непреобразуемыми также являются следующие сложные типы:

  • Одномерные массивы непреобразуемых типов, такие как массивы целых чисел. Но тип, содержащий переменный массив непреобразуемых типов уже не является преобразуемым.

  • Форматированные типы значений, содержащие только непреобразуемые типы (и классы, если они маршалируются как форматированные типы) Дополнительные сведения о передаче форматированных типов значений см. в разделе Маршалинг по умолчанию для типов значений.

Ссылки на объекты не являются непреобразуемыми. Это распространяется и на массив ссылок на объекты, которые сами по себе являются непреобразуемыми. Например, можно определить структуру, являющуюся непреобразуемым, но нельзя определить непреобразуемый тип, содержащий массив ссылок на эти структуры.

Для оптимизации массивы непреобразуемых типов и классы, содержащие только непреобразуемые члены, при маршалинге не копируются, а закрепляются. Когда вызывающий и вызываемый объекты находятся в одном подразделении, маршалинг таких типов выглядит как маршалинг с параметрами In/Out. Но в действительности маршалинг этих типов выполняется как маршалинг параметров In, и разработчик должен использовать атрибуты InAttribute и OutAttribute, если ему нужно выполнить маршалинг аргумента как параметра In/Out.

Некоторые управляемые типы данных требуют отличающегося представления в неуправляемой среде. Эти преобразуемые типы данных должны быть преобразованы к виду, для которого может быть выполнен маршалинг. Например, управляемые строки являются преобразуемыми типами, так как они должны быть преобразованы в строковые объекты, прежде чем может быть выполнен их маршалинг.

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

Преобразуемый тип

Описание

System.Array

Преобразуется в массив в стиле языка C или в SAFEARRAY.

System.Boolean

Преобразуется в значение размерностью 1, 2, или 4 байта, равное 1 или –1 в случае значения true.

System.Char

Преобразуется в знак в кодировке Юникод или ANSI.

System.Class

Преобразуется в интерфейс класса.

System.Object

Преобразуется в тип Variant или интерфейс.

System.Mdarray

Преобразуется в массив в стиле языка C или в SAFEARRAY.

System.String

Преобразуется в строку, завершающуюся пустой ссылкой или BSTR.

System.Valuetype

Преобразуется в структуру с фиксированным расположением в памяти.

System.Szarray

Преобразуется в массив в стиле языка C или в SAFEARRAY.

Типы классов и объектов поддерживаются только COM-взаимодействием. Соответствующие типы в Visual Basic 2005, C# и C++ см. в разделе Общие сведения о библиотеке классов .NET Framework.

См. также

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

Поведение маршалинга по умолчанию

Журнал изменений

Дата

Журнал

Причина

Май 2010

Уточнено, что ограничение на возвращаемые типы применяется к структурам.

Исправление ошибки содержимого.