Эквивалентность типов и внедренные типы взаимодействия

Начиная с .NET Framework 4, среда CLR поддерживает внедрение сведений о типах COM непосредственно в управляемые сборки и не требует получения управляемыми сборками сведений о типах COM из сборок взаимодействия. Поскольку внедренные сведения о типах содержат только типы и члены, которые действительно используются в управляемой сборке, в двух управляемых сборках могут быть очень разные представления одного типа COM. Все управляемые сборки имеют разные объекты Type для обозначения используемого представления типа COM. Среда CLR поддерживает эквивалентность типов между этими разными представлениями для интерфейсов, структур, перечислений и делегатов.

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

ПримечаниеПримечание

Эквивалентность типов и внедренные типы взаимодействия упрощают развертывание приложений и надстроек, использующих COM-компоненты, поскольку с приложениями не требуется развертывать сборки взаимодействия.Разработчикам общих COM-компонентов все еще необходимо создавать основные сборки взаимодействия, если необходимо, чтобы компоненты можно было использовать в более ранних версиях платформы .NET Framework.

Эквивалентность типов

Эквивалентность COM-типов поддерживается для интерфейсов, структур, перечислений и делегатов. COM-типы определяются как эквивалентные, если выполняются следующие условия:

  • Оба типа относятся или к интерфейсам, или к структурам, или к перечислениям, или к делегатам.

  • Типы имеют одинаковые удостоверения, как описано в следующем разделе.

  • Оба типа пригодны для использования эквивалентности типов, как описано в разделе Пометка COM-типов для эквивалентности типов.

Удостоверение типа

Два типа считаются имеющими одинаковое удостоверение, когда их области и идентификаторы совпадают, другими словами, если каждый из них имеет атрибут TypeIdentifierAttribute и эти два атрибута имеют одинаковые свойства Scope и Identifier. Сравнение Scope выполняется с учетом регистра.

Если у типа нет атрибута TypeIdentifierAttribute или атрибут TypeIdentifierAttribute не определяет область и идентификатор, то тип все еще может использоваться для эквивалентности типов:

  • Для интерфейсов вместо свойства TypeIdentifierAttribute.Scope используется значение GuidAttribute, а вместо свойства TypeIdentifierAttribute.Identifier используется свойство Type.FullName (которое является именем типа, включающее пространство имен).

  • Для структур, перечислений и делегатов вместо свойства Scope используется атрибут GuidAttribute содержащей сборки, а вместо свойства Identifier используется свойство Type.FullName.

Пометка COM-типов для эквивалентности типов

Тип можно пометить как допустимый для эквивалентности типов двумя способами.

  • Примените к типу атрибут TypeIdentifierAttribute.

  • Сделайте тип типом импорта COM. Интерфейс является типом импорта COM, если у него есть атрибут ComImportAttribute. Интерфейс, структура, перечисление или делегат являются типом импорта COM, если сборка, в которой они заданы, имеет атрибут ImportedFromTypeLibAttribute.

См. также

Ссылки

IsEquivalentTo

Основные понятия

Использование COM-типов в управляемом коде

Импорт библиотеки типов в виде сборки