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:
Türün kaynak kodunu özgün derlemeden hedef derlemeye taşıyın.
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))]
Şimdi türünü içeren derlemeyi derleyin.
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>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ü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:
<ItemGroup>
<ProjectReference Include="..\Common\Common.csproj" />
</ItemGroup>
Önceki C# projesi şimdi yeni oluşturulan Common derlemesine başvurur. Bu bir PackageReference
veya ProjectReference
olabilir. Yardımcı Program derlemesinin tür iletme bilgilerini sağlaması gerekir. Kural türüne göre iletme bildirimleri genellikle adlı TypeForwarders
tek 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.