Vystavení komponent .NET Core pro COM

Tento článek vás provede tím, jak zpřístupnit třídu pro COM z .NET Core (nebo .NET 5+). V tomto kurzu získáte informace o následujících postupech:

  • Zpřístupnění třídy pro model COM z .NET Core.
  • Vygenerujte server COM jako součást vytváření knihovny .NET Core.
  • Automaticky vygenerujte paralelní manifest serveru pro COM bez potřeby registru.

Požadavky

Vytvoření knihovny

Prvním krokem je vytvoření knihovny.

  1. Vytvořte novou složku a v této složce spusťte následující příkaz:

    dotnet new classlib
    
  2. Otevřít Class1.cs.

  3. Přidejte using System.Runtime.InteropServices; na začátek souboru.

  4. Vytvořte rozhraní s názvem IServer. Příklad:

    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. [Guid("<IID>")] Přidejte atribut do rozhraní s identifikátorem GUID rozhraní modelu COM, které implementujete. Například [Guid("fe103d6e-e71b-414c-80bf-982f18f6c1c7")]. Všimněte si, že tento identifikátor GUID musí být jedinečný, protože se jedná o jediný identifikátor tohoto rozhraní pro com. V sadě Visual Studio můžete vygenerovat identifikátor GUID tak, že přejdete na Nástroje > vytvořit identifikátor GUID a otevřete nástroj Vytvořit identifikátor GUID.

  6. [InterfaceType] Přidejte atribut do rozhraní a určete, jaká základní rozhraní MODELU COM by vaše rozhraní mělo implementovat.

  7. Vytvořte třídu s názvem Server , která implementuje IServer.

  8. Přidejte atribut [Guid("<CLSID>")] do třídy, s identifikátorem GUID pro COM třídu, kterou implementujete. Například [Guid("9f35b6f5-2c05-4e7f-93aa-ee087f6e7ab6")]. Jako v případě GUID rozhraní musí být tento GUID jedinečný, protože je jediným identifikátorem tohoto rozhraní v COM.

  9. [ComVisible(true)] Přidejte atribut do rozhraní i třídy.

Důležité

Na rozdíl od rozhraní .NET Framework vyžaduje .NET Core, abyste zadali CLSID libovolné třídy, kterou chcete aktivovat prostřednictvím modelu COM.

Vygenerovat hostitele COM

  1. Otevřete soubor projektu .csproj a přidejte <EnableComHosting>true</EnableComHosting> do značky <PropertyGroup></PropertyGroup>.
  2. Sestavte projekt.

Výsledný výstup bude obsahovat soubor ProjectName.dll, ProjectName.deps.jsonProjectName.runtimeconfig.json a ProjectName.comhost.dll soubor.

Registrace hostitele modelu COM pro com

Otevřete příkazový řádek se zvýšenými oprávněními a spusťte regsvr32 ProjectName.comhost.dllpříkaz . Tím se zaregistrují všechny vystavené objekty .NET u COM.

Pokud máte v úmyslu vložit knihovnu typů (TLB), doporučuje se také definovat funkce pomocí ComRegisterFunctionAttribute a ComUnregisterFunctionAttribute. Tyto funkce lze použít k registraci a zrušení registrace typové knihovny pro COM server. Úplný příklad najdete v ukázce OutOfProcCOM .

Povolení technologie RegFree COM

  1. Otevřete soubor projektu .csproj a vložte <EnableRegFreeCom>true</EnableRegFreeCom> do tagu <PropertyGroup></PropertyGroup>.
  2. Sestavte projekt.

Výsledný výstup teď bude mít také ProjectName.X.manifest soubor. Tento soubor je paralelní manifest pro použití s Registry-Free COM.

Vkládání knihoven typů do hostitele modelu COM

Na rozdíl od rozhraní .NET Framework neexistuje žádná podpora v .NET Core nebo .NET 5+ pro generování knihovny typů COM (TLB) ze sestavení .NET. Pokyny jsou, aby se ručně napsal soubor IDL nebo hlavička C/C++ pro nativní deklarace rozhraní COM. Pokud se rozhodnete napsat soubor IDL, můžete ho zkompilovat pomocí kompilátoru MIDL sady Visual C++ SDK a vytvořit TLB.

V .NET 6 a novějších verzích sada .NET SDK podporuje vkládání již zkompilovaných TLB do hostitele modelu COM v rámci sestavení projektu.

Pokud chcete do aplikace vložit knihovnu typů, postupujte takto:

  1. Otevřete soubor projektu .csproj a přidejte <ComHostTypeLibrary Include="path/to/typelib.tlb" Id="<id>" /> do značky <ItemGroup></ItemGroup>.
  2. Nahraďte <id> kladnou celočíselnou hodnotou. Hodnota musí být jedinečná mezi TLB, které určíte pro vložení do hostitele COM.
    • Atribut Id je volitelný, pokud do projektu přidáte jenom jeden ComHostTypeLibrary .

Například následující blok kódu přidá knihovnu Server.tlb typů při indexu 1 k hostiteli COM:

<ItemGroup>
    <ComHostTypeLibrary Include="Server.tlb" Id="1" />
</ItemGroup>

Načítání ve výchozím nastavení AssemblyLoadContext

Během aktivace se sestavení obsahující komponentu COM načte do samostatného AssemblyLoadContext, které je založeno na cestě sestavení. Pokud existuje jedno sestavení poskytující více serverů COM, znovu se použije, AssemblyLoadContext aby všechny servery z tohoto sestavení byly umístěny ve stejném kontextu zatížení. Pokud existuje více sestavení, která poskytují servery COM, vytvoří se pro každé sestavení nový AssemblyLoadContext a každý server se nachází v kontextu načítání, který odpovídá jeho sestavení.

V rozhraní .NET 8 a novějších verzích může sestavení určit, že by mělo být načteno ve výchozím nastavení AssemblyLoadContext. Pokud chcete povolit načítání ve výchozím kontextu, přidejte do projektu následující položku RuntimeHostConfigurationOption :

<ItemGroup>
  <RuntimeHostConfigurationOption Include="System.Runtime.InteropServices.COM.LoadComponentInDefaultContext" Value="true" />
</ItemGroup>

Vzorek

V úložišti dotnet/samples na GitHubu je plně funkční ukázka serveru COM.

Další poznámky

Důležité

V rozhraní .NET Framework lze sestavení "Any CPU" využívat 32bitoví i 64bitoví klienti. Ve výchozím nastavení jsou v .NET Core, .NET 5 a novějších verzích assembly "Any CPU" doplněny o 64bitovou knihovnu *.comhost.dll. Z tohoto důvodu je můžou využívat pouze 64bitoví klienti. Toto je výchozí hodnota, protože to představuje sada SDK. Toto chování je identické s tím, jak je funkce "samostatná" publikována: ve výchozím nastavení používá to, co poskytuje SDK. Vlastnost NETCoreSdkRuntimeIdentifier MSBuild určuje bitovou verzi *.comhost.dll. Spravovaná část je ve skutečnosti platformově nezávislá podle očekávání, ale přidružená nativní komponenta ve výchozím nastavení odkazuje na cílenou sadu SDK.

Samostatná nasazení komponent modelu COM se nepodporují. Podporují se pouze nasazení komponent modelu COM závislá na rozhraní.

Zveřejnění komponent modelu COM z projektů C++/CLI prostřednictvím vlastnosti EnableComHosting se nepodporuje.

Načtení rozhraní .NET Framework i .NET Core do stejného procesu skutečně představuje omezení v diagnostice. Primárním omezením je ladění spravovaných komponent, protože není možné ladit rozhraní .NET Framework i .NET Core současně. Kromě toho dvě instance modulu runtime nesdílejí spravovaná sestavení. To znamená, že není možné sdílet skutečné typy .NET napříč dvěma prostředími runtime a místo toho všechny interakce musí být omezeny pouze na vystavené kontrakty rozhraní COM.