.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

Kitaplığı oluşturma

İlk adım kitaplığı oluşturmaktır.

  1. Yeni bir klasör oluşturun ve bu klasörde aşağıdaki komutu çalıştırın:

    dotnet new classlib
    
  2. Class1.cs'ı açın.

  3. Dosyanın en üstüne ekleyin using System.Runtime.InteropServices; .

  4. adlı IServerbir 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();
    }
    
  5. 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.

  6. özniteliğini [InterfaceType] arabirime ekleyin ve arabiriminizin hangi temel COM arabirimlerini uygulayacağını belirtin.

  7. uygulayan IServeradlı Server bir sınıf oluşturun.

  8. ö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.

  9. ö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

  1. .csproj Proje dosyasını açın ve bir <PropertyGroup></PropertyGroup> etiketin içine ekleyin<EnableComHosting>true</EnableComHosting>.
  2. Projeyi derleyin.

Sonuçta elde edilen çıktı bir ProjectName.dll, ProjectName.deps.jsonProjectName.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.

RegFree COM'un etkinleştirilmesi

  1. .csproj Proje dosyasını açın ve bir <PropertyGroup></PropertyGroup> etiketin içine ekleyin<EnableRegFreeCom>true</EnableRegFreeCom>.
  2. 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:

  1. .csproj Proje dosyasını açın ve bir <ItemGroup></ItemGroup> etiketin içine ekleyin<ComHostTypeLibrary Include="path/to/typelib.tlb" Id="<id>" />.
  2. 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 tane ComHostTypeLibrary 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 AssemblyLoadContextiç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.

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.