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

Начиная с .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.

См. также