.NET Core-összetevők elérhetővé tehetők a COM-nak

Ez a cikk bemutatja, hogyan teheti elérhetővé az osztályt a COM-nak a .NET Core-ból (vagy .NET 5+). Ez az oktatóanyag a következőket mutatja be:

  • Osztályt tehet közzé a COM-nak a .NET Core-ból.
  • Com-kiszolgáló létrehozása a .NET Core-kódtár létrehozása során.
  • Automatikusan létrehoz egy egymás melletti kiszolgálójegyzéket a beállításjegyzék-mentes COM-hoz.

Előfeltételek

A tár létrehozása

Az első lépés a kódtár létrehozása.

  1. Hozzon létre egy új mappát, és ebben a mappában futtassa a következő parancsot:

    dotnet new classlib
    
  2. Nyílt Class1.cs.

  3. Adja hozzá using System.Runtime.InteropServices; a fájl elejéhez.

  4. Hozzon létre egy felületet.IServer Példa:

    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. Adja hozzá az [Guid("<IID>")] attribútumot az illesztőhöz a implementálandó COM-felület GUID azonosítójával. Például: [Guid("fe103d6e-e71b-414c-80bf-982f18f6c1c7")]. Vegye figyelembe, hogy ennek a GUID-nak egyedinek kell lennie, mivel ez a COM-felület egyetlen azonosítója. A Visual Studióban a GUID létrehozása eszköz megnyitásához nyissa meg a Guid-azonosító létrehozása eszközt az Eszközök > GUID létrehozása elemre kattintva.

  6. Adja hozzá az [InterfaceType] attribútumot az interfészhez, és adja meg, hogy milyen alap COM-interfészeket kell implementálnia.

  7. Hozzon létre egy implementálható osztályt ServerIServer.

  8. Adja hozzá az [Guid("<CLSID>")] attribútumot az osztályhoz a megvalósítandó COM-osztály GUID azonosítójával. Például: [Guid("9f35b6f5-2c05-4e7f-93aa-ee087f6e7ab6")]. Az interfész GUID azonosítóihoz hasonlóan ennek a GUID-nak is egyedinek kell lennie, mivel ez az interfész egyetlen azonosítója a COM számára.

  9. Adja hozzá az [ComVisible(true)] attribútumot az interfészhez és az osztályhoz is.

Fontos

A .NET-keretrendszer-hez hasonlóan a .NET Core-ban meg kell adnia minden olyan osztály CLSID-azonosítóját, amelyet com-on keresztül aktiválni szeretne.

A COM-gazdagép létrehozása

  1. Nyissa meg a .csproj projektfájlt, és adja hozzá <EnableComHosting>true</EnableComHosting> egy <PropertyGroup></PropertyGroup> címkén belül.
  2. Készítse el a projektet.

Az eredményként kapott kimenet egy , ProjectName.deps.jsonProjectName.runtimeconfig.json és ProjectName.comhost.dll egy ProjectName.dllfájllal fog rendelkezni.

A COM-gazdagép regisztrálása a COM-hoz

Nyisson meg egy rendszergazda jogú parancssort, és futtassa a parancsot regsvr32 ProjectName.comhost.dll. Ezzel regisztrálja az összes közzétett .NET-objektumot a COM-on.

A RegFree COM engedélyezése

  1. Nyissa meg a .csproj projektfájlt, és adja hozzá <EnableRegFreeCom>true</EnableRegFreeCom> egy <PropertyGroup></PropertyGroup> címkén belül.
  2. Készítse el a projektet.

Az eredményként kapott kimenet most már fájllal ProjectName.X.manifest is rendelkezik. Ez a fájl a registry-free COM-hoz használható, egymás melletti jegyzékfájl.

Típuskódtárak beágyazása a COM-gazdagépen

A .NET-keretrendszer ellentétben a .NET Core vagy a .NET 5+ nem támogatja a COM-típustár (TLB) .NET-szerelvényből való generálására. Az útmutató egy IDL-fájl vagy egy C/C++ fejléc manuális írása a COM-felületek natív deklarációihoz. Ha úgy dönt, hogy IDL-fájlt ír, lefordíthatja a Visual C++ SDK MIDL-fordítójával, hogy TLB-t állítson elő.

A .NET 6-os és újabb verzióiban a .NET SDK támogatja a már lefordított TBS-ek beágyazását a COM-gazdagépbe a projekt buildjének részeként.

Ha típustárat szeretne beágyazni az alkalmazásba, kövesse az alábbi lépéseket:

  1. Nyissa meg a .csproj projektfájlt, és adja hozzá <ComHostTypeLibrary Include="path/to/typelib.tlb" Id="<id>" /> egy címkén <ItemGroup></ItemGroup> belül.
  2. Cserélje le <id> pozitív egész számra. Az értéknek egyedinek kell lennie a COM-gazdagépbe beágyazandó TBS-ek között.
    • Az Id attribútum nem kötelező, ha csak egyet ComHostTypeLibrary ad hozzá a projekthez.

A következő kódblokk például hozzáadja az Server.tlb indexben 1 lévő típustárat a COM-gazdagéphez:

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

Betöltés az alapértelmezett értéken AssemblyLoadContext

Az aktiválás során a COM-összetevőt tartalmazó szerelvény a szerelvény elérési útja alapján külön-külön AssemblyLoadContext lesz betöltve. Ha egy szerelvény több COM-kiszolgálót biztosít, a rendszer úgy használja újra a AssemblyLoadContext szerelvényt, hogy az adott szerelvény összes kiszolgálója ugyanabban a terhelési környezetben legyen. Ha több szerelvény biztosít COM-kiszolgálókat, minden egyes szerelvényhez létrejön egy új AssemblyLoadContext , és minden kiszolgáló a szerelvénynek megfelelő terhelési környezetben található.

A .NET 8 és újabb verzióiban a szerelvény megadhatja, hogy az alapértelmezett AssemblyLoadContexthelyen legyen betöltve. Ha engedélyezni szeretné a betöltést az alapértelmezett környezetben, adja hozzá a következő RuntimeHostConfigurationOption elemet a projekthez:

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

Minta

A GitHub dotnet/samples adattárában egy teljesen működőképes COM-kiszolgálói minta található.

További megjegyzések

Fontos

A .NET-keretrendszer a 32 bites és a 64 bites ügyfelek egyaránt használhatják a "Bármely CPU" szerelvényt. Alapértelmezés szerint a .NET Core, a .NET 5 és újabb verziókban a "Bármely CPU" szerelvényekhez 64 bites *.comhost.dll társul. Emiatt csak 64 bites ügyfelek használhatják fel őket. Ez az alapértelmezett érték, mert az SDK ezt jelöli. Ez a viselkedés megegyezik az "önálló" funkció közzétételével: alapértelmezés szerint az SDK által biztosított funkciókat használja. Az NETCoreSdkRuntimeIdentifier MSBuild tulajdonság határozza meg a *.comhost.dll bitképességét. A felügyelt rész valójában a várt bitképesség-agnosztikus, de a hozzá tartozó natív eszköz alapértelmezés szerint a célzott SDK-ba kerül.

A COM-összetevők önálló üzembe helyezései nem támogatottak. Csak a COM-összetevők keretrendszerfüggő üzemelő példányai támogatottak.

Emellett a .NET-keretrendszer és a .NET Core ugyanabba a folyamatba való betöltése diagnosztikai korlátozásokkal is rendelkezik. Az elsődleges korlátozás a felügyelt összetevők hibakeresése, mivel nem lehetséges egyszerre .NET-keretrendszer és .NET Core hibakeresése. Emellett a két futtatókörnyezeti példány nem osztozik felügyelt szerelvényeken. Ez azt jelenti, hogy nem lehet tényleges .NET-típusokat megosztani a két futtatókörnyezetben, ehelyett az összes interakciót a közzétett COM-felületi szerződésekre kell korlátozni.