Bereitstellen von COM-Komponenten mit ClickOnce

Die Bereitstellung von COM-Legacykomponenten war traditionell eine schwierige Aufgabe. Komponenten müssen global registriert werden und können daher unerwünschte Nebenwirkungen zwischen sich überschneidenden Anwendungen verursachen. Diese Situation ist in .NET Framework-Anwendungen in der Regel kein Problem, da Komponenten vollständig für eine Anwendung isoliert oder parallel kompatibel sind. Mit Visual Studio können Sie isolierte COM-Komponenten im Windows-Betriebssystem bereitstellen.

ClickOnce bietet einen einfachen und sicheren Mechanismus für die Bereitstellung Ihrer .NET-Anwendungen. Wenn Ihre Anwendungen jedoch COM-Legacykomponenten verwenden, müssen Sie zusätzliche Schritte für deren Bereitstellung ausführen. In diesem Thema wird beschrieben, wie isolierte COM-Komponenten bereitgestellt und auf native Komponenten (z. B. aus Visual Basic 6.0 oder Visual C++) verwiesen wird.

Weitere Informationen zum Bereitstellen isolierter COM-Komponenten finden Sie unter Vereinfachen der App-Bereitstellung mit ClickOnce und COM ohne Registrierung.

COM ohne Registrierung

Registrierungsfreies COM ist eine neue Technologie zum Bereitstellen und Aktivieren isolierter COM-Komponenten. Es funktioniert, indem alle Typbibliotheks- und Registrierungsinformationen der Komponente, die normalerweise in der Systemregistrierung installiert werden, in einer XML-Datei namens „Manifest“ gespeichert werden, die im selben Ordner wie die Anwendung gespeichert wird.

Um eine COM-Komponente zu isolieren, muss sie auf dem Computer des Entwicklers registriert werden, nicht aber auf dem Computer des Endbenutzers. Zum Isolieren einer COM-Komponente müssen Sie lediglich die Isolated-Eigenschaft ihres Verweises auf TRUE festlegen. Standardmäßig ist diese Eigenschaft auf FALSE festgelegt und gibt somit an, dass sie als registrierter COM-Verweis behandelt werden soll. Wenn diese Eigenschaft TRUE ist, wird zur Buildzeit ein Manifest für diese Komponente generiert. Außerdem werden die entsprechenden Dateien während der Installation in den Anwendungsordner kopiert.

Wenn der Manifestgenerator auf einen isolierten COM-Verweis stößt, zählt er alle Einträge in der CoClass-Typbibliothek der Komponente auf und ordnet jedem Eintrag die entsprechenden Registrierungsdaten zu. Außerdem werden Manifestdefinitionen für alle COM-Klassen in der Typbibliotheksdatei generiert.

Bereitstellen von COM-Komponenten ohne Registrierung mithilfe von ClickOnce

Die ClickOnce-Bereitstellungstechnologie eignet sich gut für die Bereitstellung isolierter COM-Komponenten, da sowohl ClickOnce als auch COM ohne Registrierung erfordern, dass eine Komponente über ein Manifest verfügen muss, um bereitgestellt zu werden.

In der Regel sollte der Autor der Komponente ein Manifest bereitstellen. Andernfalls kann Visual Studio jedoch auch automatisch ein Manifest für eine COM-Komponente generieren. Die Manifestgenerierung wird während des ClickOnce-Veröffentlichungsprozesses durchgeführt. Weitere Informationen finden Sie unter Veröffentlichen von ClickOnce-Anwendungen. Mit diesem Feature können Sie auch ältere Komponenten nutzen, die Sie in früheren Entwicklungsumgebungen wie Visual Basic 6.0 erstellt haben.

ClickOnce stellt COM-Komponenten auf zwei Arten bereit:

  • Verwenden des Bootstrapper, um Ihre COM-Komponenten bereitzustellen. Dies funktioniert auf allen unterstützten Plattformen.

  • Verwenden nativer Komponentenisolation (auch als COM-Bereitstellung ohne Registrierung bezeichnet).

Beispiel für das Isolieren und Bereitstellen einer einfachen COM-Komponente

Um die Bereitstellung von COM-Komponenten ohne Registrierung zu veranschaulichen, erstellt dieses Beispiel eine Windows-basierte Anwendung in Visual Basic, die auf eine isolierte native COM-Komponente verweist, die mit Visual Basic 6.0 erstellt wurde, und stellt sie mit ClickOnce bereit.

Zuerst müssen Sie die native COM-Komponente erstellen:

So erstellen Sie eine native COM-Komponente
  1. Klicken Sie in Visual Basic 6.0 im Menü Datei auf Neu und dann auf Projekt.

  2. Wählen Sie im Dialogfeld Neues Projekt den Knoten Visual Basic aus, und wählen Sie ein ActiveX DLL-Projekt aus. Geben Sie im Feld NameVB6Helloein.

    Hinweis

    Nur die Projekttypen „ActiveX-DLL“ und „ActiveX-Steuerelement“ werden mit COM ohne Registrierung unterstützt. Die Projekttypen „ActiveX-EXE“ und „ActiveX-Dokument“ werden nicht unterstützt.

  3. Doppelklicken Sie im Projektmappen-Explorer auf Class1.vb, um den Text-Editor zu öffnen.

  4. Fügen Sie in „Class1.vb“ den folgenden Code nach dem generierten Code für die New-Methode hinzu:

    Public Sub SayHello()
       MsgBox "Message from the VB6Hello COM component"
    End Sub
    
  5. Erstellen Sie die Komponente. Klicken Sie im Menü Build auf Projektmappe erstellen.

Hinweis

COM ohne Registrierung unterstützt nur DLL- und COM-Steuerelementprojekttypen. Sie können keine EXE-Dateien mit COM ohne Registrierung verwenden.

Jetzt können Sie eine Windows-basierte Anwendung erstellen und ihr einen Verweis auf die COM-Komponente hinzufügen.

So erstellen Sie eine Windows-basierte Anwendung mithilfe einer COM-Komponente
  1. Klicken Sie in Visual Basic im Menü Datei auf Neu und dann auf Projekt.

  2. Wählen Sie im Dialogfeld Neues Projekt den Knoten Visual Basic und dann Windows-Anwendung aus. Geben Sie im Feld NameRegFreeComDemoein.

  3. Klicken Sie in Projektmappen-Explorer auf die Schaltfläche Alle Dateien anzeigen, um die Projektverweise anzuzeigen.

  4. Klicken Sie mit der rechten Maustaste auf den Knoten Verweise, und wählen Sie dann Verweise hinzufügen im Kontextmenü aus.

  5. Klicken Sie im Dialogfeld Verweis hinzufügen auf die Registerkarte Durchsuchen, navigieren Sie zu „VB6Hello.dll“, und wählen Sie diese Datei aus.

    In der Verweisliste wird ein VB6Hello-Verweis angezeigt.

  6. Zeigen Sie auf die Toolbox, wählen Sie ein Button-Steuerelement aus, und ziehen Sie es auf das Formular Form1.

  7. Legen Sie im Fenster Eigenschaften die Eigenschaft Text der Schaltfläche auf TRUE fest.

  8. Doppelklicken Sie auf die Schaltfläche, um Handlercode hinzuzufügen, und fügen Sie in der Codedatei Code hinzu, damit der Handler wie folgt aussieht:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim VbObj As New VB6Hello.Class1
        VbObj.SayHello()
    End Sub
    
  9. Führen Sie die Anwendung aus. Klicken Sie im Menü Debuggen auf Debuggen starten.

    Nun müssen Sie das Steuerelement isolieren. Jede von Ihrer Anwendung verwendete COM-Komponente wird in Ihrem Projekt als COM-Verweis dargestellt. Diese Verweise werden unter dem Knoten Verweise im Fenster Projektmappen-Explorer angezeigt. (Beachten Sie, dass Sie Verweise entweder direkt mit dem Befehl Verweis hinzufügen im Menü Projekt oder indirekt durch Ziehen eines ActiveX-Steuerelements auf das Formular hinzufügen können.)

    Die folgenden Schritte zeigen, wie Sie die COM-Komponente isolieren und die aktualisierte Anwendung veröffentlichen, die das isolierte Steuerelement enthält:

So isolieren Sie eine COM-Komponente
  1. Wählen Sie im Projektmappen-Explorer im Knoten Verweise den Verweis VB6Hello aus.

  2. Ändern Sie im Fenster Eigenschaften den Wert der Isolated-Eigenschaft von FALSE in TRUE.

  3. Klicken Sie im Menü Build auf Projektmappe erstellen.

    Wenn Sie nun F5 drücken, funktioniert die Anwendung wie erwartet, wird aber jetzt unter COM ohne Registrierung ausgeführt. Um dies zu beweisen, versuchen Sie, die Registrierung der VB6Hello.dll-Komponente aufzuheben und „RegFreeComDemo1.exe“ außerhalb der Visual Studio-IDE auszuführen. Wenn dieses Mal auf die Schaltfläche geklickt wird, funktioniert sie weiterhin. Wenn Sie das Anwendungsmanifest vorübergehend umbenennen, tritt erneut ein Fehler auf.

Hinweis

Sie können das Fehlen einer COM-Komponente simulieren, indem Sie die Registrierung vorübergehend aufheben. Öffnen Sie eine Eingabeaufforderung, wechseln Sie zu Ihrem Systemordner, indem Sie cd /d %windir%\system32 eingeben, und heben Sie die Registrierung der Komponente auf, indem Sie regsvr32 /u VB6Hello.dll eingeben. Sie können sie erneut registrieren, indem Sie regsvr32 VB6Hello.dll eingeben.

Der letzte Schritt besteht darin, die Anwendung mit ClickOnce zu veröffentlichen:

So veröffentlichen Sie ein Anwendungsupdate mit einer isolierten COM-Komponente
  1. Klicken Sie im Menü Erstellen auf RegFreeComDemo veröffentlichen.

    Der Webpublishing-Assistent wird angezeigt.

  2. Geben Sie im Veröffentlichungs-Assistenten einen Speicherort auf dem Datenträger des lokalen Computers an, an dem Sie auf die veröffentlichten Dateien zugreifen und diese untersuchen können.

  3. Klicken Sie auf Fertig stellen, um die Anwendung zu veröffentlichen.

    Wenn Sie die veröffentlichten Dateien untersuchen, werden Sie feststellen, dass die Datei „sysmon.ocx“ enthalten ist. Das Steuerelement ist vollständig für diese Anwendung isoliert, d. h., wenn auf dem Computer des Endbenutzers eine andere Anwendung ausgeführt wird, die eine andere Version des Steuerelements verwendet, kann sie diese Anwendung nicht beeinträchtigen.

Verweisen auf native Assemblys

Visual Studio unterstützt Verweise auf native Visual Basic 6.0- oder C++-Assemblys. Solche Verweise werden als „native Verweise“ bezeichnet. Sie können feststellen, ob ein Verweis nativ ist, indem Sie überprüfen, ob seine Eigenschaft Dateityp auf Nativ oder ActiveX festgelegt ist.

Um einen nativen Verweis hinzuzufügen, verwenden Sie den Befehl Verweis hinzufügen, und navigieren Sie dann zum Manifest. Einige Komponenten platzieren das Manifest in der DLL. In diesem Fall können Sie einfach die DLL selbst auswählen, und Visual Studio fügt sie als nativen Verweis hinzu, wenn erkannt wird, dass die Komponente ein eingebettetes Manifest enthält. Visual Studio schließt auch automatisch alle abhängigen Dateien oder Assemblys ein, die im Manifest aufgeführt werden, wenn sie sich im selben Ordner wie die Komponente befinden, auf die verwiesen wird.

COM-Steuerungelementisolation vereinfacht die Bereitstellung von COM-Komponenten, die noch nicht über Manifeste verfügen. Wenn eine Komponente jedoch mit einem Manifest bereitgestellt wird, können Sie direkt auf das Manifest verweisen. Tatsächlich sollten Sie immer nach Möglichkeit das vom Autor der Komponente bereitgestellte Manifest verwenden, anstatt die Isolated-Eigenschaft zu verwenden.

Einschränkungen der Bereitstellung von COM-Komponenten ohne Registrierung

COM ohne Registrierung bietet klare Vorteile im Vergleich zu herkömmlichen Bereitstellungstechniken.

Nicht jede Komponente ist ein geeigneter Kandidat für COM ohne Registrierung. Eine Komponente ist nicht geeignet, wenn eine der folgenden Aussagen zutrifft:

  • Die Komponente ist ein Out-of-Process-Server. EXE-Server werden nicht unterstützt. Nur DLLs werden unterstützt.

  • Die Komponente ist Teil des Betriebssystems oder eine Systemkomponente, z. B. XML, eine Browserkomponente oder MDAC (Microsoft Data Access Components). Sie sollten die Redistributionsrichtlinie des Komponentenautors beachten. Wenden Sie sich an Ihren Hersteller.

  • Die Komponente ist Teil einer Anwendung, z. B. von Microsoft Office. Sie sollten beispielsweise nicht versuchen, das Microsoft Excel-Objektmodell zu isolieren. Dieses ist Teil von Office und kann nur auf einem Computer verwendet werden, auf dem das vollständige Office-Produkt installiert ist.

  • Die Komponente ist für die Verwendung als Add-In oder Snap-In vorgesehen, z. B. als Office-Add-In oder als Steuerelement in einem Webbrowser. Solche Komponenten erfordern in der Regel ein Registrierungsschema, das von der Hostingumgebung definiert wird und über den Bereich des Manifests selbst hinausgeht.

  • Die Komponente verwaltet ein physisches oder virtuelles Gerät für das System, z. B. einen Gerätetreiber für einen Druckspooler.

  • Die Komponente ist ein Redistributable für Datenzugriff. Datenanwendungen erfordern in der Regel, dass ein separates Redistributable für Datenzugriff installiert werden muss, bevor sie ausgeführt werden können. Sie sollten nicht versuchen, Komponenten wie das Microsoft ADO-Datensteuerelement, Microsoft OLE DB oder MDAC (Microsoft Data Access Components) zu isolieren. Wenn Ihre Anwendung MDAC oder SQL Server Express verwendet, sollten Sie diese stattdessen als Voraussetzungen festlegen. Weitere Informationen finden Sie unter Vorgehensweise: Installieren von Voraussetzungen mit einer ClickOnce-Anwendung.

    In einigen Fällen kann es für den Entwickler der Komponente möglich sein, sie für COM ohne Registrierung umzugestalten. Wenn dies nicht möglich ist, können Sie über das Standardregistrierungsschema mit dem Bootstrapper trotzdem Anwendungen erstellen und veröffentlichen, die davon abhängen. Weitere Informationen finden Sie unter Erstellen von Bootstrapperpaketen.

    Eine COM-Komponente kann nur ein Mal pro Anwendung isoliert werden. Sie können beispielsweise nicht dieselbe COM-Komponente aus zwei verschiedenen Klassenbibliothekprojekten isolieren, die Teil derselben Anwendung sind. Dies würde zu einer Buildwarnung führen, und die Anwendung kann zur Laufzeit nicht geladen werden. Um dieses Problem zu vermeiden, empfiehlt Microsoft, COM-Komponenten in einer einzelnen Klassenbibliothek zu kapseln.

    Es gibt mehrere Szenarien, in denen die COM-Registrierung auf dem Computer des Entwicklers erforderlich ist, obwohl für die Bereitstellung der Anwendung keine Registrierung erforderlich ist. Die Isolated-Eigenschaft erfordert, dass die COM-Komponente auf dem Computer des Entwicklers registriert wird, um das Manifest während des Buildvorgangs automatisch zu generieren. Es gibt keine Registrierungserfassungsfunktionen, die die Selbstregistrierung während des Buildvorgangs aufrufen. Außerdem sind alle Klassen, die nicht explizit in der Typbibliothek definiert sind, nicht im Manifest enthalten. Bei Verwendung einer COM-Komponente mit einem bereits vorhandenen Manifest, z. B. einem nativen Verweis, muss die Komponente möglicherweise nicht zur Entwicklungszeit registriert sein. Eine Registrierung ist jedoch erforderlich, wenn es sich bei der Komponente um ein ActiveX-Steuerelement handelt und Sie es in die Toolbox und den Windows Forms-Designer einbinden möchten.