Преобразуемые типы
![]() | Эта статья предоставляет недостаточный контекст для тех, кто не знаком с предметом . ( Май 2018 г. ) |
Преобразуемые типы — это типы данных в Microsoft .NET Framework , которые имеют идентичное представление в памяти как для управляемого , так и для неуправляемого кода. Понимание разницы между преобразуемыми и непреобразуемыми типами может помочь в использовании COM Interop или P/Invoke — двух методов взаимодействия в приложениях .NET.
Источник
[ редактировать ]Операцию копирования памяти иногда называют передачей блоков , сокращенно до бит-блит (а специальное оборудование для такой передачи называется блиттером ). Blittable — это специфичный для .NET термин, обозначающий, разрешено ли копировать объект с помощью блочной передачи.
Обзор совместимости
[ редактировать ]Взаимодействие может представлять собой двунаправленный обмен данными и методами между неуправляемым кодом и управляемым кодом .NET . .NET предоставляет два способа взаимодействия между ними: COM Interop и P/Invoke. Хотя методология разная, в обоих случаях должна иметь место маршалинг (преобразование между представлениями данных, форматами вызова функций и форматами возврата значений). COM Interop занимается этим преобразованием между управляемым кодом и COM-объектами , тогда как P/Invoke обрабатывает взаимодействие между управляемым кодом и Win32 кодом . Концепция преобразуемых и непреобразуемых типов данных применима к обоим, особенно к проблеме преобразования данных между управляемой и неуправляемой памятью. Этот маршалинг выполняется маршаллером взаимодействия, который автоматически вызывается средой CLR при необходимости.
Определены преобразуемые типы
[ редактировать ]Преобразуемый тип — это тип данных, который не требует особого внимания со стороны маршалера взаимодействия, поскольку по умолчанию он имеет общее представление в управляемой и неуправляемой памяти. Закрепив данные в памяти, сборщик мусора не сможет их переместить, что позволит совместно использовать их на месте с неуправляемым приложением. [ 1 ] Это означает, что как управляемый, так и неуправляемый код будут изменять ячейки памяти этих типов согласованным образом, и маршалеру потребуется гораздо меньше усилий для поддержания целостности данных. Ниже приведены некоторые примеры преобразуемых типов, доступных в .NET Framework: [ 2 ]
System.Byte
System.SByte
System.Int16
System.UInt16
System.Int32
System.UInt32
System.Int64
System.UInt64
System.IntPtr
System.UIntPtr
System.Single
System.Double
Кроме того, одномерные массивы этих типов (включая небезопасные фиксированные буферы ), а также сложные типы, содержащие только поля экземпляров (включая поля только для чтения ) этих типов, являются blitable. Наличие статических или константных полей, которые не могут быть преобразованы, не приводит к тому, что тип становится непреобразуемым, поскольку такие поля не играют никакой роли в маршалинге. Сложные типы (то есть структуры или классы) также должны иметь макет поля экземпляра Sequential , примененный с использованием атрибута [StructLayout], чтобы маршалер .NET считал их переносимыми. Этот атрибут применяется к структурам автоматически компилятором, но его необходимо явно добавить в определение класса, чтобы сделать класс, который иначе не может быть преобразован в преобразование, может быть преобразован.
Если тип не является одним из преобразуемых типов, он классифицируется как непреобразуемый. Причина, по которой тип считается непреобразуемым, заключается в том, что одно представление в управляемой памяти может иметь несколько потенциальных представлений в неуправляемой памяти или наоборот. Альтернативно, как в управляемой, так и в неуправляемой памяти может существовать ровно одно представление типа. Также часто бывает так, что ни с той, ни с другой стороны просто нет представительства. Ниже приведены некоторые часто используемые непреобразуемые типы в .NET Framework: [ 2 ]
System.Boolean
System.Char
System.Object
System.String
Существует гораздо больше преобразуемых и непреобразуемых типов, а определяемые пользователем типы могут относиться к любой категории в зависимости от того, как они определены (MSDN).
Использование
[ редактировать ]Это весьма ограничительное понятие преобразуемых типов, по-видимому, ограничивает полезность служб совместимости, предоставляемых .NET, но это не так. Хотя преобразуемые типы допускают прямое определение взаимодействующих типов, существуют различные способы явного определения того, как непреобразуемый тип должен быть преобразован маршалером взаимодействия. [ 3 ] [ 4 ] Например, в языках .NET существует множество атрибутов, которые можно применять к полям типов, к самим типам и параметрам методов, чтобы указать маршалеру, как обрабатывать эти конкретные данные. Эти атрибуты имеют различные цели, например, для детализации упаковки или выравнивания типа, указания смещений полей в типе, указания представления массива или строки, управления стилем передачи параметров для вызовов функций, указания методов управления памятью и т. д. Если ни один из атрибутов или других инструментов, предусмотренных в структуре, не является адекватным, детальный контроль обеспечивается за счет возможности реализовать ICustomMarshaler
интерфейс и вручную выполнить преобразование данных в обоих направлениях.
Понимание того, что представляет собой преобразуемый тип, позволяет разработчику определять ситуации, когда вмешательство требуется или не требуется для правильного маршалинга типа. Таким образом, меньше времени тратится на чрезмерную спецификацию типов или вызовов функций.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Журнал MSDN — новый взгляд на P/Invoke» . Msdn.microsoft.com . Проверено 5 декабря 2011 г.
- ^ Jump up to: а б «MSDN — преобразуемые и непреобразуемые типы» . Msdn.microsoft.com . Проверено 5 февраля 2016 г.
- ^ «MSDN — Обзор маршалинга взаимодействия» . Msdn.microsoft.com . Проверено 5 февраля 2016 г.
- ^ «Взаимодействие MSDN и .NET» . Msdn2.microsoft.com . Проверено 5 декабря 2011 г.