Przekazywanie dalej typu w środowisku uruchomieniowym języka wspólnego
Przekazywanie typów umożliwia przeniesienie typu do innego zestawu bez konieczności ponownego kompilowania aplikacji korzystających z oryginalnego zestawu.
Załóżmy na przykład, że aplikacja używa Example
klasy w zestawie o nazwie Utility.dll. Deweloperzy Utility.dll mogą zdecydować się na refaktoryzację zestawu, a w procesie mogą przenieść klasę Example
do innego zestawu. Jeśli stara wersja Utility.dll zostanie zastąpiona przez nową wersję Utility.dll i jej zestawu towarzyszącego, aplikacja używająca Example
klasy zakończy się niepowodzeniem, ponieważ nie może zlokalizować Example
klasy w nowej wersji Utility.dll.
Deweloperzy Utility.dll mogą tego uniknąć, przekazując żądania dla Example
klasy przy użyciu atrybutu TypeForwardedToAttribute . Jeśli atrybut został zastosowany do nowej wersji Utility.dll, żądania dla Example
klasy są przekazywane do zestawu, który zawiera teraz klasę. Istniejąca aplikacja nadal działa normalnie bez ponownej kompilacji.
Prześlij dalej typ
Istnieją cztery kroki przekazywania typu:
Przenieś kod źródłowy typu z oryginalnego zestawu do zestawu docelowego.
W zestawie, w którym znajduje się typ używany do zlokalizowania, dodaj element TypeForwardedToAttribute dla typu, który został przeniesiony. Poniższy kod przedstawia atrybut typu o nazwie
Example
, który został przeniesiony.[assembly:TypeForwardedToAttribute(Example::typeid)]
[assembly:TypeForwardedToAttribute(typeof(Example))]
Skompiluj zestaw, który zawiera teraz typ.
Ponownie skompiluj zestaw, w którym znajduje się typ, z odwołaniem do zestawu, który zawiera teraz typ. Jeśli na przykład kompilujesz plik C# z wiersza polecenia, użyj opcji Odwołania (opcje kompilatora języka C#), aby określić zestaw zawierający typ. W języku C++użyj dyrektywy #using w pliku źródłowym, aby określić zestaw zawierający typ.
Przykład przekazywania typów w języku C#
Kontynuując powyższy przykładowy opis, wyobraź sobie, że opracowujesz Utility.dll i masz klasę Example
. Plik Utility.csproj to podstawowa biblioteka klas:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsing>true</ImplicitUsing>
</PropertyGroup>
</Project>
Klasa Example
udostępnia kilka właściwości i przesłonięć Object.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}";
}
Teraz wyobraź sobie, że istnieje projekt zużywający i jest reprezentowany w zestawie konsumenta . Ten czasochłonny projekt odwołuje się do zestawu Narzędzia . Na przykład tworzy wystąpienie Example
obiektu i zapisuje go w konsoli w pliku Program.cs :
using System;
using Common.Objects;
Example example = new();
Console.WriteLine(example);
Po uruchomieniu aplikacji zużywających dane wyjściowe będą zwracać stan Example
obiektu. W tym momencie nie ma przekazywania typów, ponieważ plik Consuming.csproj odwołuje się do pliku Utility.csproj. Jednak deweloper zestawu Narzędzia decyduje się usunąć Example
obiekt w ramach refaktoryzacji. Ten typ jest przenoszony do nowo utworzonego pliku Common.csproj.
Usuwając ten typ z zestawu Narzędzi , deweloperzy wprowadzają zmianę powodującą niezgodność. Wszystkie projekty zużywające zostaną przerwane po zaktualizowaniu do najnowszego zestawu narzędzi .
Zamiast wymagać od projektów korzystających z dodania nowego odwołania do zestawu Common , możesz przekazać ten typ. Ponieważ ten typ został usunięty z zestawu Narzędzia, musisz mieć odwołanie Utility.csproj do pliku Common.csproj:
<ItemGroup>
<ProjectReference Include="..\Common\Common.csproj" />
</ItemGroup>
Powyższy projekt w języku C# odwołuje się teraz do nowo utworzonego wspólnego zestawu. Może to być element PackageReference
lub ProjectReference
. Zestaw narzędzi musi podać informacje przekazujące typy. Zgodnie z deklaracjami przesyłania dalej typu konwencji są zwykle hermetyzowane w jednym pliku o nazwie TypeForwarders
, należy wziąć pod uwagę następujący plik TypeForwarders.cs C# w zestawie narzędzi :
using System.Runtime.CompilerServices;
using Common.Objects;
[assembly:TypeForwardedTo(typeof(Example))]
Zestaw Narzędzia odwołuje się do wspólnego zestawu i przekazuje Example
typ. Jeśli chcesz skompilować zestaw Narzędzi z deklaracjami przekazywania typów i usunąć Utility.dll do pojemnika zużywające , aplikacja zużywana będzie działać bez kompilowania.