Vystavení komponent .NET Core pro COM

Tento článek vás provede zveřejněním třídy modelu COM z .NET Core (nebo .NET 5+). V tomto kurzu získáte informace o následujících postupech:

  • Zpřístupňuje třídu modelu COM z .NET Core.
  • Vygenerujte server COM jako součást vytváření knihovny .NET Core.
  • Automaticky vygenerujte manifest serveru vedle sebe pro com bez 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ře záznam typu 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. [Guid("<CLSID>")] Přidejte do třídy atribut s identifikátorem třídy GUID třídy, kterou implementujete. Například [Guid("9f35b6f5-2c05-4e7f-93aa-ee087f6e7ab6")]. Stejně jako u identifikátoru GUID rozhraní musí být tento identifikátor JEDINEČNÝ, protože se jedná o jediný identifikátor tohoto rozhraní modelu 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.

Vygenerování hostitele modelu COM

  1. .csproj Otevřete soubor projektu a přidejte <EnableComHosting>true</EnableComHosting> ho 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.

Povolení modelu COM RegFree

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

Výsledný výstup teď bude mít ProjectName.X.manifest také soubor. Tento soubor je souběžný manifest pro použití s com bez registru.

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ů MODELU COM (TLB) ze sestavení .NET. Pokyny jsou ruční zápis souboru IDL nebo hlavičky C/C++ pro nativní deklarace rozhraní MODELU 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. .csproj Otevřete soubor projektu a přidejte <ComHostTypeLibrary Include="path/to/typelib.tlb" Id="<id>" /> ho do značky<ItemGroup></ItemGroup>.
  2. Nahraďte <id> kladnou celočíselnou hodnotou. Hodnota musí být jedinečná mezi tlb, které zadáte, aby byla vložena 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 umístění na základě cesty 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 MODELU COM, vytvoří se pro každé sestavení nový AssemblyLoadContext a každý server se nachází v kontextu zatížení, 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í "Libovolný procesor" využívat 32bitová i 64bitová klienti. Ve výchozím nastavení jsou v .NET Core, .NET 5 a novějších verzích doplněna 64bitová *.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 publikovaná funkce "samostatná": ve výchozím nastavení používá to, co sada SDK poskytuje. Vlastnost NETCoreSdkRuntimeIdentifier MSBuild určuje bitovou verzi *.comhost.dll. Spravovaná část je ve skutečnosti nezávislá na bitové verzi podle očekávání, ale doprovodný nativní prostředek se ve výchozím nastavení používá k cílové sadě SDK.

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

Načtení rozhraní .NET Framework i .NET Core do stejného procesu má navíc omezení diagnostiky. 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 moduly runtime a místo toho musí být všechny interakce omezené na vystavené kontrakty rozhraní COM.