.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
- Telepítse a .NET Core 3.0 SDK-t vagy egy újabb verziót.
A tár létrehozása
Az első lépés a kódtár létrehozása.
Hozzon létre egy új mappát, és ebben a mappában futtassa a következő parancsot:
dotnet new classlib
Nyílt
Class1.cs
.Adja hozzá
using System.Runtime.InteropServices;
a fájl elejéhez.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(); }
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.Adja hozzá az
[InterfaceType]
attribútumot az interfészhez, és adja meg, hogy milyen alap COM-interfészeket kell implementálnia.Hozzon létre egy implementálható osztályt
Server
IServer
.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.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
- Nyissa meg a
.csproj
projektfájlt, és adja hozzá<EnableComHosting>true</EnableComHosting>
egy<PropertyGroup></PropertyGroup>
címkén belül. - Készítse el a projektet.
Az eredményként kapott kimenet egy , ProjectName.deps.json
ProjectName.runtimeconfig.json
és ProjectName.comhost.dll
egy ProjectName.dll
fá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
- Nyissa meg a
.csproj
projektfájlt, és adja hozzá<EnableRegFreeCom>true</EnableRegFreeCom>
egy<PropertyGroup></PropertyGroup>
címkén belül. - 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:
- 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. - 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 egyetComHostTypeLibrary
ad hozzá a projekthez.
- Az
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 AssemblyLoadContext
helyen 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.
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: