.NET Core bileşenlerini COM’da kullanıma sunma
Bu makalede, .NET Core'dan (veya .NET 5+) COM'a bir sınıfın nasıl kullanıma sunma adımları anlatıldı. Bu öğretici şunların nasıl yapıldığını gösterir:
- Bir sınıfı .NET Core'dan COM'a sunma.
- .NET Core kitaplığınızı oluşturmanın bir parçası olarak bir COM sunucusu oluşturun.
- Registry-Free COM için otomatik olarak yan yana bir sunucu bildirimi oluşturun.
Önkoşullar
- .NET Core 3.0 SDK'sı veya daha yeni bir sürüm yükleyin.
Kitaplığı oluşturma
İlk adım kitaplığı oluşturmaktır.
Yeni bir klasör oluşturun ve bu klasörde aşağıdaki komutu çalıştırın:
dotnet new classlib
Class1.cs
'ı açın.Dosyanın en üstüne ekleyin
using System.Runtime.InteropServices;
.adlı
IServer
bir arabirim oluşturun. Örneğin: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(); }
Arabirimine
[Guid("<IID>")]
özniteliğini ekleyin ve uygulamakta olduğunuz COM arabiriminin arabirim GUID'sini ekleyin. Örneğin,[Guid("fe103d6e-e71b-414c-80bf-982f18f6c1c7")]
. COM için bu arabirimin tek tanımlayıcısı olduğundan bu GUID'nin benzersiz olması gerektiğini unutmayın. Visual Studio'da, Araçlar > GUID Oluştur'a gidip GUID Oluştur aracını açarak bir GUID oluşturabilirsiniz.özniteliğini
[InterfaceType]
arabirime ekleyin ve arabiriminizin hangi temel COM arabirimlerini uygulayacağını belirtin.uygulayan
IServer
adlıServer
bir sınıf oluşturun.özniteliğini
[Guid("<CLSID>")]
, uyguladığınız COM sınıfının sınıf tanımlayıcı GUID'siyle sınıfa ekleyin. Örneğin,[Guid("9f35b6f5-2c05-4e7f-93aa-ee087f6e7ab6")]
. Arabirim GUID'sinde olduğu gibi, bu GUID de COM için bu arabirimin tek tanımlayıcısı olduğundan benzersiz olmalıdır.özniteliğini
[ComVisible(true)]
hem arabirime hem de sınıfa ekleyin.
Önemli
.NET Framework'ün aksine. .NET Core, COM aracılığıyla eyleme geçirilebilir olmasını istediğiniz herhangi bir sınıfın CLSID'sini belirtmenizi gerektirir.
COM konağı oluşturma
.csproj
Proje dosyasını açın ve bir<PropertyGroup></PropertyGroup>
etiketin içine ekleyin<EnableComHosting>true</EnableComHosting>
.- Projeyi derleyin.
Sonuçta elde edilen çıktı bir ProjectName.dll
, ProjectName.deps.json
ProjectName.runtimeconfig.json
ve ProjectName.comhost.dll
dosyasına sahip olur.
COM ana bilgisayarını COM için kaydetme
Yükseltilmiş bir komut istemi açın ve komutunu çalıştırın regsvr32 ProjectName.comhost.dll
. Bu, kullanıma sunulan tüm .NET nesnelerinizi COM'a kaydeder.
Bir tür kitaplığı (TLB) eklemek istiyorsanız ve ComUnregisterFunctionAttribute
kullanarak ComRegisterFunctionAttribute
işlevleri de tanımlamanız önerilir. Bu işlevler, COM sunucusu için TLB'yi kaydetmek ve kaydını silmek için kullanılabilir. Tam bir örnek için örneğe OutOfProcCOM
bakın.
RegFree COM'un etkinleştirilmesi
.csproj
Proje dosyasını açın ve bir<PropertyGroup></PropertyGroup>
etiketin içine ekleyin<EnableRegFreeCom>true</EnableRegFreeCom>
.- Projeyi derleyin.
Sonuçta elde edilen çıktının da bir ProjectName.X.manifest
dosyası olacaktır. Bu dosya, Registry-Free COM ile kullanılmak üzere yan yana bildirimdir.
COM konağına tür kitaplıkları ekleme
.NET Framework'ten farklı olarak, .NET derlemesinden COM Tür Kitaplığı (TLB) oluşturmak için .NET Core veya .NET 5+ desteği yoktur. Kılavuz, COM arabirimlerinin yerel bildirimleri için el ile bir IDL dosyası veya C/C++ üst bilgisi yazmaktır. Bir IDL dosyası yazmaya karar verirseniz, TLB oluşturmak için visual C++ SDK'sının MIDL derleyicisi ile derleyebilirsiniz.
.NET 6 ve sonraki sürümlerde .NET SDK'sı, proje derlemenizin bir parçası olarak COM konağına önceden derlenmiş TLB'ler eklemeyi destekler.
Uygulamanıza tür kitaplığı eklemek için şu adımları izleyin:
.csproj
Proje dosyasını açın ve bir<ItemGroup></ItemGroup>
etiketin içine ekleyin<ComHostTypeLibrary Include="path/to/typelib.tlb" Id="<id>" />
.- değerini pozitif bir tamsayı değeriyle değiştirin
<id>
. DEĞERIn COM konağına katıştırılması için belirttiğiniz TLB'ler arasında benzersiz olması gerekir.Id
Özniteliği, projenize yalnızca bir taneComHostTypeLibrary
eklerseniz isteğe bağlıdır.
Örneğin, aşağıdaki kod bloğu dizindeki 1
tür kitaplığını Server.tlb
COM konağına ekler:
<ItemGroup>
<ComHostTypeLibrary Include="Server.tlb" Id="1" />
</ItemGroup>
Varsayılan olarak yükleniyor AssemblyLoadContext
Etkinleştirme sırasında, COM bileşenini içeren derleme, derleme yoluna göre ayrı AssemblyLoadContext bir şekilde yüklenir. Birden çok COM sunucusu sağlayan bir derleme varsa, AssemblyLoadContext
bu derlemedeki tüm sunucuların aynı yük bağlamında bulunması için yeniden kullanılır. COM sunucuları sağlayan birden çok derleme varsa, her derleme için yeni AssemblyLoadContext
bir oluşturulur ve her sunucu kendi derlemesine karşılık gelen yük bağlamında bulunur.
.NET 8 ve sonraki sürümlerinde, derleme varsayılan AssemblyLoadContext
içinde yüklenmesi gerektiğini belirtebilir. Varsayılan bağlamda yüklemeyi etkinleştirmek için projeye aşağıdaki RuntimeHostConfigurationOption öğesini ekleyin:
<ItemGroup>
<RuntimeHostConfigurationOption Include="System.Runtime.InteropServices.COM.LoadComponentInDefaultContext" Value="true" />
</ItemGroup>
Örnek
GitHub'daki dotnet/samples deposunda tam işlevsel bir COM sunucusu örneği vardır.
Ek notlar
Önemli
.NET Framework'te bir "Herhangi bir CPU" derlemesi hem 32 bit hem de 64 bit istemciler tarafından kullanılabilir. Varsayılan olarak, .NET Core, .NET 5 ve sonraki sürümlerde "Tüm CPU" derlemelerine 64 bit *.comhost.dll eşlik eder. Bu nedenle, bunlar yalnızca 64 bit istemciler tarafından kullanılabilir. SDK'nın temsil ettiği varsayılan değer budur. Bu davranış, "bağımsız" özelliğin yayımlanma şekliyle aynıdır: varsayılan olarak SDK'nın sağladığını kullanır. NETCoreSdkRuntimeIdentifier
MSBuild özelliği * .comhost.dll bitliğini belirler. Yönetilen bölüm aslında beklendiği gibi bitlik belirsizdir, ancak eşlik eden yerel varlık varsayılan olarak hedeflenen SDK'dır.
COM bileşenlerinin bağımsız dağıtımları desteklenmez. YALNıZCA COM bileşenlerinin çerçeveye bağımlı dağıtımları desteklenir.
C++/CLI projelerindeki COM bileşenlerini EnableComHosting özelliği aracılığıyla kullanıma çıkarma desteklenmez.
Ayrıca hem .NET Framework hem de .NET Core'un aynı işleme yüklenmesinin tanılama sınırlamaları vardır. Hem .NET Framework hem de .NET Core hatalarını aynı anda ayıklamak mümkün olmadığından, birincil sınırlama yönetilen bileşenlerin hata ayıklamasıdır. Ayrıca, iki çalışma zamanı örneği yönetilen derlemeleri paylaşmaz. Bu, gerçek .NET türlerini iki çalışma zamanı arasında paylaşmanın mümkün olmadığı ve bunun yerine tüm etkileşimlerin kullanıma sunulan COM arabirimi sözleşmeleriyle kısıtlanması gerektiği anlamına gelir.