Richtlinien für das Offenlegen von Funktionen in COM

Die Common Language Runtime stellt umfassende Unterstützung für die Interoperabilität mit COM-Komponenten bereit. Eine COM-Komponente kann innerhalb eines verwalteten Typs verwendet werden, und eine verwaltete Instanz kann von einer COM-Komponente verwendet werden. Diese Unterstützung ist der Schlüssel dafür, dass nicht-verwalteter Code Stück für Stück in verwalteten Code übergeführt werden kann. Sie impliziert jedoch auch einige Herausforderungen für Entwickler von Klassenbibliotheken. Damit ein verwalteter Typ vollständig in COM-Clients offengelegt werden kann, muss der Typ die Funktionen so offenlegen, dass dies durch COM unterstützt wird und der COM-Versionserstellungsvereinbarung entspricht.

Kennzeichnen Sie verwaltete Klassenbibliotheken mit dem ComVisibleAttribute-Attribut, um anzugeben, ob COM-Clients die Bibliothek direkt verwenden können, oder ob sie einen Wrapper verwenden müssen, der die Funktionen so umformt, dass sie sie verwenden können.

Typen und Schnittstellen, die direkt von COM-Clients verwendet werden müssen, z. B. für einen Host in einem nicht-verwalteten Container, sollten mit dem ComVisible(true)-Attribut gekennzeichnet werden. Der transitive Schluss aller Typen, auf die durch offengelegte Typen verwiesen wird, sollte explizit als ComVisible(true) gekennzeichnet werden. Andernfalls werden diese Typen als IUnknown offengelegt.

Hinweis   Member eines Typs können auch als ComVisible(false) gekennzeichnet werden. Dadurch wird die Offenlegung in COM minimiert, und somit werden die Beschränkungen hinsichtlich dessen, welche Elemente ein verwalteter Typ verwendenkann, verringert.

Typen, die mit dem ComVisible(true)-Attribut gekennzeichnet sind, können Funktionen nicht ausschließlich auf eine Weise offenlegen, die von COM nicht genutzt werden kann. Insbesondere unterstützt COM keine statischen Methoden oder Konstruktoren mit Parametern. Testen Sie die Funktionen des Typs mit COM-Clients, um ein ordnungsgemäßes Verhalten sicherzustellen. Machen Sie sich bewusst, welche Auswirkungen die Umstellung aller Typen auf parallel erstellbare Typen auf die Registry hat.

Marshal By Reference

Marshal-by-reference-Objekte sind remotefähige Objekte. Die Remoteanwendung von Objekten gilt für drei verschiedene Typen:

  • Typen, deren Instanzen kopiert werden, wenn sie über eine AppDomain-Grenze gemarshallt werden (auf dem gleichen oder auf einem anderen Computer). Diese Typen müssen mit dem Serializable-Attribut gekennzeichnet werden.
  • Typen, für die die Runtime einen transparenten Proxy erstellt, wenn sie über eine AppDomain-Grenze gemarshallt werden (auf dem gleichen oder auf einem anderen Computer). Diese Typen müssen letztendlich von der System.MarshalByRefObject-Klasse abgeleitet werden.
  • Typen, die nicht über AppDomain-Grenzen gemarshallt werden. Dies ist die Standardeinstellung.

Halten Sie die folgenden Regeln ein, wenn Sie Marshal by reference verwenden:

  • Standardmäßig sollten Instanzen Marshal-by-value-Objekte sein. Das bedeutet, dass ihre Typen als Serializable gekennzeichnet werden sollten.
  • Komponententypen sollten Marshal-by-reference-Objekte sein. Dies sollte für die meisten Komponenten bereits der Fall sein, da die allgemeine Basisklasse System.Component eine Marshal-by-reference-Klasse ist.
  • Wenn der Typ eine Betriebssystemressource einkapselt, sollte er ein Marshal-by-reference-Objekt sein. Wenn der Typ die IDisposable-Schnittstelle implementiert, muss er wahrscheinlich als Verweis gemarshallt werden (Marshal-by-reference). System.IO.Stream wird von MarshalByRefObject abgeleitet. Die meisten Streams, z. B. FileStream und NetworkStream, kapseln externe Ressourcen ein und sollten daher Marshal-by-reference-Objekte sein.
  • Instanzen, die lediglich den Status speichern, sollten Marshal-by-value-Objekte sein (z. B. ein DataSet).
  • Spezielle Typen, die nicht über eine AppDomain aufgerufen werden können (z. B. für die Aufbewahrung von statischen Dienstprogrammmethoden) sollten nicht als Serializable gekennzeichnet werden.

Siehe auch

Entwurfsrichtlinien für die Entwicklung von Klassenbibliotheken | System.MarshalByRefObject-Klasse | Offenlegen von .NET Framework-Komponenten in COM