Aracılığıyla paylaş


Ortak Dil Çalışma Zamanı'nda tür yönlendirme

Tür iletme, özgün derlemeyi kullanan uygulamaları yeniden derlemek zorunda kalmadan bir türü başka bir derlemeye taşımanızı sağlar.

Örneğin, bir uygulamanın Exampleadlı derlemede sınıfını kullandığını varsayalım. Utility.dll geliştiricileri derlemeyi yeniden düzenlemeye karar verebilir ve bu süreçte sınıfı başka bir derlemeye taşıyabilirExample. Eski Utility.dll sürümü, yeni Utility.dll sürümü ve ona eşlik eden derleme ile değiştirilirse, Example sınıfını kullanan uygulama, Example sınıfını yeni Utility.dll sürümünde bulamaz ve bu nedenle başarısız olur.

Utility.dll geliştiricileri, özniteliğini kullanarak Example sınıfına TypeForwardedToAttribute yönelik istekleri ileterek bundan kaçınabilir. Yeni özniteliği Utility.dll sürümüne uygulandıysa, Example sınıfı için yapılan istekler şimdi sınıfın bulunduğu derlemeye yönlendirilir. Mevcut uygulama, yeniden derleme olmadan normal şekilde çalışmaya devam eder.

Tür yönlendirme

Bir türü iletmenin dört adımı vardır:

  1. Türün kaynak kodunu özgün derlemeden hedef derlemeye taşıyın.

  2. Kullanılan türün bulunduğu derlemede, taşınan tür için bir TypeForwardedToAttribute ekleyin. Aşağıdaki kod, taşınan adlı Example türün özniteliğini gösterir.

     [assembly:TypeForwardedToAttribute(Example::typeid)]
    
     [assembly:TypeForwardedToAttribute(typeof(Example))]
    
  3. Şimdi türü içeren derlemeyi oluşturun.

  4. Türün bulunduğu derlemeyi, şimdi türünü içeren derlemeye bir başvuruyla yeniden derle. Örneğin, komut satırından bir C# dosyası derlediyseniz, türü içeren derlemeyi belirtmek için Başvurular (C# derleyici seçenekleri) seçeneğini kullanın. C++'ta, türü içeren derlemeyi belirtmek için kaynak dosyadaki #using yönergesini kullanın.

C# türü iletme örneği

Yukarıdaki eşleştirilmiş örnek açıklamasından devam edersek, Utility.dllgeliştirdiğinizi ve bir Example sınıfınız olduğunu düşünün. Utility.csproj temel bir sınıf kitaplığıdır:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsing>true</ImplicitUsing>
  </PropertyGroup>

</Project>

Example sınıfı birkaç özellik sağlar ve geçersiz kılarObject.ToString:

using System;

namespace Common.Objects;

public class Example
{
    public string Message { get; init; } = "Hi friends!";

    public Guid Id { get; init; } = Guid.NewGuid();

    public DateOnly Date { get; init; } = DateOnly.FromDateTime(DateTime.Today);

    public sealed override string ToString() =>
        $"[{Id} - {Date}]: {Message}";
}

Şimdi, tüketici bir proje olduğunu ve bunun Tüketici derlemesinde temsil edildiğini hayal edin. Bu tüketen proje Yardımcı Program derlemesine başvurur. Örneğin, nesnesinin örneğini Example oluşturur ve Program.cs dosyasında konsola yazar:

using System;
using Common.Objects;

Example example = new();

Console.WriteLine(example);

Tüketen uygulama çalıştırıldığında, nesnenin durumunu çıktı olarak Example verir. Bu noktada, Consuming.csproj, Utility.csproj dosyasına başvurulduğu için tür iletimi yoktur. Ancak Utility derlemesinin geliştiricileri, yeniden düzenlemenin bir parçası olarak Example nesnesini kaldırmaya karar verdiler. Bu tür, yeni oluşturulan bir Common.csproj dosyasına taşınır.

Bu tür Yardımcı Program derlemesinden kaldırıldığında geliştiriciler hataya neden olan bir değişiklikle karşı karşıyadır. Tüketen tüm projeler en son Yardımcı Program derlemesine güncelleştirildiğinde bozulacaktır.

Kullanan projelerin Common derlemesine yeni bir başvuru eklemesini gerektirmek yerine türünü iletebilirsiniz. Bu tür Yardımcı Program derlemesinden kaldırıldığından, Utility.csproj dosyasının Common.csproj'a başvurması gerekir.

<ItemGroup>
  <ProjectReference Include="..\Common\Common.csproj" />
</ItemGroup>

Önceki C# projesi şimdi yeni oluşturulan Common derlemesine başvurur. Bu bir PackageReference veya ProjectReferenceolabilir. Yardımcı Program derlemesinin tür iletme bilgilerini sağlaması gerekir. Kural türüne göre iletme bildirimleri genellikle adlı TypeForwarderstek bir dosyada kapsüllenir, Yardımcı Program derlemesinde aşağıdaki TypeForwarders.cs C# dosyasını göz önünde bulundurun:

using System.Runtime.CompilerServices;
using Common.Objects;

[assembly:TypeForwardedTo(typeof(Example))]

Utility derlemesi Common derlemesine başvurur ve türünü iletirExample. Eğer Yardımcı Program derlemesini tür iletme bildirimleriyle derleyecekseniz ve Utility.dllTüketici kutusuna bırakacaksanız, tüketici uygulama derlenmeden çalışır.

Ayrıca bakınız