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

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

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

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

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

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

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

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

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

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

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

Преобразуемые типы Description
System.Array Преобразует в массив в стиле C или SAFEARRAY.
System.Boolean Преобразует в одно-, двух- или четырехбайтовое значение, где true выражается как 1 или -1.
System.Char Преобразует в символ Юникода или ANSI.
System.Class Преобразует в интерфейс класса.
System.Object Преобразует в вариант или интерфейс.
System.Mdarray Преобразует в массив в стиле C или SAFEARRAY.
System.String Преобразует в строку, завершающуюся ссылкой NULL, или в BSTR.
System.Valuetype Преобразует в структуру с фиксированным расположением в памяти.
System.Szarray Преобразует в массив в стиле C или SAFEARRAY.

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

См. также