Typäquivalenz und eingebettete Interop-Typen
Ab der Version .NET Framework, Version 4 unterstützt die Common Language Runtime das direkte Einbetten von Typinformationen für COM-Typen in verwaltete Assemblys, anstatt zu fordern, dass die verwalteten Assemblys, Typinformationen für COM-Typen aus Interopassemblys abrufen. Da die eingebetteten Typinformationen nur die Typen und Member enthalten, die tatsächlich von einer verwalteten Assembly verwendet werden, können zwei verwaltete Assemblys über stark unterschiedliche Ansichten des gleichen COM-Typs verfügen. Jede verwaltete Assembly besitzt ein anderes Type-Objekt, um seine Ansicht des COM-Typs darzustellen. Die Common Language Runtime unterstützt Äquivalenz zwischen diesen unterschiedlichen Ansichten für Schnittstellen, Strukturen, Enumerationen und Delegaten.
Typäquivalenz bedeutet, dass ein COM-Objekt, das von einer verwalteten Assembly an eine andere übergeben wird, in der empfangenden Assembly in den entsprechenden verwalteten Typ umgewandelt werden kann.
Hinweis |
---|
Typäquivalenz und eingebettete Interop-Typen vereinfachen die Bereitstellung von Anwendungen und Add-Ins, die COM-Komponenten verwenden, da es nicht notwendig ist, Interopassemblys mit den Anwendungen bereitzustellen.Entwickler von freigegebenen COM-Komponenten müssen immer noch primäre Interopassemblys (PIAs) erstellen, wenn ihre Komponenten mit früheren Versionen von .NET Framework kompatibel sein sollen. |
Typäquivalenz
Äquivalenz von COM-Typen wird für Schnittstellen, Strukturen, Enumerationen und Delegaten unterstützt. COM-Typen gelten als Äquivalent, wenn alle der folgenden Bedingungen wahr sind:
Die Typen sind beide Schnittstellen oder beide Strukturen oder beide Enumerationen oder beide Delegaten.
Die Typen besitzen die gleiche Identität (siehe nächster Abschnitt).
Beide Typen sind für Typäquivalenz geeignet (siehe Abschnitt Markieren von COM-Typen für Typäquivalenz).
Typidentität
Zwei Typen besitzen die gleiche Identität, wenn ihre Bereiche und Identitäten übereinstimmen, anders ausgedrückt, wenn sie jeweils über das TypeIdentifierAttribute-Attribut verfügen, und wenn die zwei Attribute die folgenden übereinstimmenden Eigenschaften besitzen: Scope und Identifier. Beim Vergleich für Scope wird die Groß- und Kleinschreibung nicht berücksichtigt.
Wenn ein Typ nicht über das TypeIdentifierAttribute-Attribut verfügt, oder wenn es ein TypeIdentifierAttribute-Attribut besitzt, durch das kein Bereich und Bezeichner angegeben wird, kann der Typ immer noch folgendermaßen für Äquivalenz in Betracht gezogen werden:
Für Schnittstellen wird der Wert des GuidAttribute-Objekts anstelle der TypeIdentifierAttribute.Scope-Eigenschaft verwendet, und die Type.FullName-Eigenschaft (das heißt, der Typname, einschließlich des Namespaces) wird anstelle der TypeIdentifierAttribute.Identifier-Eigenschaft verwendet.
Für Strukturen, Enumerationen und Delegaten wird das GuidAttribute-Objekt der enthaltenden Assembly anstelle der Scope-Eigenschaft verwendet, und die Type.FullName-Eigenschaft wird anstelle der Identifier-Eigenschaft verwendet.
Markieren von COM-Typen für Typäquivalenz
Sie können einen Typ für Typäquivalenz auf zweierlei Art als geeignet markieren:
Übernehmen Sie das TypeIdentifierAttribute-Attribut für den Typ.
Legen Sie den Typ als COM-Importtyp fest. Eine Schnittstelle ist ein COM-Importtyp, wenn sie über das ComImportAttribute-Attribut verfügt. Eine Schnittstelle, Struktur, Enumeration oder ein Delegat ist ein COM-Importtyp, wenn die Assembly, in der der Typ definiert wird, über das ImportedFromTypeLibAttribute-Attribut verfügt.