Verfügbarmachen von .NET Core-Komponenten in COMExposing .NET Core components to COM

In .NET Core wurde das Verfügbarmachen von .NET-Objekten für COM im Vergleich zum .NET Framework deutlich optimiert.In .NET Core, the process for exposing your .NET objects to COM has been significantly streamlined in comparison to .NET Framework. Im Folgenden wird erläutert, wie Sie eine Klasse für COM verfügbar machen.The following process will walk you through how to expose a class to COM. In diesem Tutorial lernen Sie:This tutorial shows you how to:

  • Verfügbarmachen einer Klasse für COM in .NET CoreExpose a class to COM from .NET Core.
  • Generieren eines COM-Servers bei der Erstellung einer .NET Core-BibliothekGenerate a COM server as part of building your .NET Core library.
  • Automatisches Generieren eines Manifests zur parallelen Serverausführung ohne COM-RegistrierungAutomatically generate a side-by-side server manifest for Registry-Free COM.

VoraussetzungenPrerequisites

Erstellen der BibliothekCreate the library

Im ersten Schritt erstellen Sie die Bibliothek.The first step is to create the library.

  1. Erstellen Sie einen neuen Ordner, und führen Sie in diesem Ordner den folgenden Befehl aus:Create a new folder, and in that folder run the following command:

    dotnet new classlib
    
  2. Öffnen Sie Class1.cs.Open Class1.cs.

  3. Fügen Sie using System.Runtime.InteropServices; am Anfang der Datei ein.Add using System.Runtime.InteropServices; to the top of the file.

  4. Erstellen Sie eine Schnittstelle mit dem Namen IServer.Create an interface named IServer. Zum Beispiel:For example:

    using System;
    using System.Runtime.InteropServices;
    
    [ComVisible(true)]
    [Guid(ContractGuids.ServerInterface)]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IServer
    {
        /// <summary>
        /// Compute the value of the constant Pi.
        /// </summary>
        double ComputePi();
    }
    
  5. Fügen Sie der Schnittstelle das [Guid("<IID>")]-Attribut mit der Schnittstellen-GUID für die COM-Schnittstelle hinzu, die Sie implementieren.Add the [Guid("<IID>")] attribute to the interface, with the interface GUID for the COM interface you're implementing. Beispielsweise [Guid("fe103d6e-e71b-414c-80bf-982f18f6c1c7")].For example, [Guid("fe103d6e-e71b-414c-80bf-982f18f6c1c7")]. Diese GUID muss eindeutig sein, da sie der einzige Bezeichner dieser COM-Schnittstelle ist.Note that this GUID needs to be unique since it is the only identifier of this interface for COM. In Visual Studio können Sie eine GUID generieren. Rufen Sie dazu „Extras“ > „GUID erstellen“ auf, um das entsprechende Tool zu verwenden.In Visual Studio, you can generate a GUID by going to Tools > Create GUID to open the Create GUID tool.

  6. Fügen Sie der Schnittstelle das [InterfaceType]-Attribut hinzu, und geben Sie an, welche COM-Basisschnittstellen Ihre Schnittstelle implementieren soll.Add the [InterfaceType] attribute to the interface and specify what base COM interfaces your interface should implement.

  7. Erstellen Sie eine Klasse mit dem Namen Server, die IServer implementiert.Create a class named Server that implements IServer.

  8. Fügen Sie der Klasse das [Guid("<CLSID>")]-Attribut mit der Klassenbezeichner-GUID für die COM-Klasse hinzu, die Sie implementieren.Add the [Guid("<CLSID>")] attribute to the class, with the class identifier GUID for the COM class you're implementing. Beispielsweise [Guid("9f35b6f5-2c05-4e7f-93aa-ee087f6e7ab6")].For example, [Guid("9f35b6f5-2c05-4e7f-93aa-ee087f6e7ab6")]. Diese GUID muss genau wie die Schnittstellen-GUID eindeutig sein, da sie der einzige Bezeichner dieser COM-Schnittstelle ist.As with the interface GUID, this GUID must be unique since it is the only identifier of this interface to COM.

  9. Fügen Sie der Schnittstelle und der Klasse das [ComVisible(true)]-Attribut hinzu.Add the [ComVisible(true)] attribute to both the interface and the class.

Wichtig

Anders als im .NET Framework müssen Sie in .NET Core die CLSID jeder Klasse angeben, die über COM aktivierbar sein soll.Unlike in .NET Framework, .NET Core requires you to specify the CLSID of any class you want to be activatable via COM.

Generieren des COM-HostsGenerate the COM host

  1. Öffnen Sie die Projektdatei .csproj, und fügen Sie <EnableComHosting>true</EnableComHosting> innerhalb eines <PropertyGroup></PropertyGroup>-Tags hinzu.Open the .csproj project file and add <EnableComHosting>true</EnableComHosting> inside a <PropertyGroup></PropertyGroup> tag.
  2. Erstellen Sie das Projekt.Build the project.

Die Ausgabe enthält die Dateien ProjectName.dll, ProjectName.deps.json, ProjectName.runtimeconfig.json und ProjectName.comhost.dll.The resulting output will have a ProjectName.dll, ProjectName.deps.json, ProjectName.runtimeconfig.json and ProjectName.comhost.dll file.

Registrieren des COM-Hosts für COMRegister the COM host for COM

Öffnen Sie eine Eingabeaufforderung mit erhöhten Rechten, und führen Sie regsvr32 ProjectName.comhost.dll aus.Open an elevated command prompt and run regsvr32 ProjectName.comhost.dll. Dadurch werden alle verfügbaren .NET-Objekte bei COM registriert.That will register all of your exposed .NET objects with COM.

Aktivieren von COM ohne RegistrierungEnabling RegFree COM

  1. Öffnen Sie die Projektdatei .csproj, und fügen Sie <EnableRegFreeCom>true</EnableRegFreeCom> innerhalb eines <PropertyGroup></PropertyGroup>-Tags hinzu.Open the .csproj project file and add <EnableRegFreeCom>true</EnableRegFreeCom> inside a <PropertyGroup></PropertyGroup> tag.
  2. Erstellen Sie das Projekt.Build the project.

Die Ausgabe enthält nun auch die Datei ProjectName.X.manifest.The resulting output will now also have a ProjectName.X.manifest file. Bei dieser Datei handelt es sich um das Manifest zur parallelen Ausführung, das ohne COM-Registrierung verwendet werden kann.This file is the side-by-side manifest for use with Registry-Free COM.

BeispielSample

Ein voll funktionsfähiges Beispiel für COM-Server finden Sie im GitHub-Repository „dotnet/samples“.There is a fully functional COM server sample in the dotnet/samples repository on GitHub.

Zusätzliche HinweiseAdditional notes

Anders als im .NET Framework wird in .NET Core die Erstellung einer COM-Typbibliothek (TLB) aus einer .NET Core-Assembly nicht unterstützt.Unlike in .NET Framework, there is no support in .NET Core for generating a COM Type Library (TLB) from a .NET Core assembly. Die Anweisung besagt, dass Sie manuell eine IDL-Datei oder einen C++ Header für die nativen Deklarationen Ihrer Schnittstellen schreiben müssen.The guidance is to either manually write an IDL file or a C/C++ header for the native declarations of the COM interfaces.

Eigenständige Bereitstellungen von COM-Komponenten werden nicht unterstützt.Self-contained deployments of COM components are not supported. Nur frameworkabhängige Bereitstellungen von COM-Komponenten werden unterstützt.Only framework-dependent deployments of COM components are supported.

Zusätzlich gelten für das Laden von .NET Framework und .NET Core in denselben Prozess Diagnoseeinschränkungen.Additionally, loading both .NET Framework and .NET Core into the same process does have diagnostic limitations. Die erste Einschränkung ist das Debuggen von verwalteten Komponenten, da es nicht möglich ist, .NET Framework und .NET Core gleichzeitig zu debuggen.The primary limitation is the debugging of managed components as it is not possible to debug both .NET Framework and .NET Core at the same time. Zusätzlich teilen die beiden Runtimeinstanzen keine verwalteten Assemblys.In addition, the two runtime instances don't share managed assemblies. Das bedeutet, dass es nicht möglich ist, die tatsächlichen .NET-Typen über zwei Runtimes freizugeben. Stattdessen unterliegen alle Interaktionen den verfügbar gemachten Verträgen zur COM-Schnittstelle.This means that it isn't possible to share actual .NET types across the two runtimes and instead all interactions must be restricted to the exposed COM interface contracts.