Ortak dil çalışma zamanında tür iletme

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 sınıfını Example Utility.dll adlı bir derlemede 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. Utility.dll'ın eski sürümü yeni Utility.dll sürümü ve onun eşlikçi derlemesiyle değiştirilirse, sınıfını kullanan Example uygulama sınıfı yeni Utility.dll sürümünde bulamadığından Example başarısız olur.

Utility.dll geliştiricileri, özniteliğini kullanarak TypeForwardedToAttribute sınıfına yönelik Example istekleri ileterek bundan kaçınabilir. özniteliği yeni Utility.dll sürümüne uygulanmışsa, sınıfına Example yönelik istekler artık sınıfını içeren derlemeye iletilir. Mevcut uygulama, yeniden derleme olmadan normal şekilde çalışmaya devam eder.

Türü iletme

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ünü içeren derlemeyi derleyin.

  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 örnek açıklamaya devam edersek, Utility.dll geliş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>net6.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üketen bir proje olduğunu ve bunun Tüketici derlemesinde temsil ettiğini düşünün. 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 durumunun çıkışını Example alır. Bu noktada, Consuming.csproj Utility.csproj dosyasına başvurarak tür iletme yoktur. Ancak Yardımcı Program derlemesinin geliştiricisi, yeniden düzenlemenin bir parçası olarak nesneyi kaldırmaya Example karar verir. 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 dosyasına başvurması gerekir:

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

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

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

</Project>

Ö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. Yardımcı Program derlemesini tür iletme bildirimleriyle derleyecek ve Utility.dll Tüketen kutusuna bırakacaksanız, tüketen uygulama derlenmeden çalışır.

Ayrıca bkz.