Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A típustovábbítás lehetővé teszi, hogy egy típust egy másik szerelvénybe helyezze át anélkül, hogy újrafordító alkalmazásokat kellene létrehoznia, amelyek az eredeti szerelvényt használják.
Tegyük fel például, hogy egy alkalmazás egy ExampleUtility.dllnevű szerelvény osztályát használja. A Utility.dll fejlesztői dönthetnek úgy, hogy újra átfésülik a szerelvényt, és a folyamat során áthelyezik az osztályt Example egy másik szerelvénybe. Ha a Utility.dll régi verzióját a Utility.dll új verziója és a hozzá tartozó szerelvény váltja fel, az osztályt használó Example alkalmazás meghiúsul, mert nem találja az osztályt Example a Utility.dllúj verziójában.
A Utility.dll fejlesztői elkerülhetik ezt az osztályra vonatkozó Example kérések továbbításával az TypeForwardedToAttribute attribútum használatával. Ha az attribútumot a Utility.dllúj verziójára alkalmazták, a rendszer az Example osztályra vonatkozó kéréseket továbbítja az osztályt tartalmazó szerelvénynek. A meglévő alkalmazás továbbra is normálisan működik, újrafordítás nélkül.
Egy típus továbbítása
Egy típus továbbításának négy lépése van:
Helyezze át a típus forráskódját az eredeti szerelvényből a célszerelvénybe.
Adja hozzá az áthelyezett típushoz azt TypeForwardedToAttribute a szerelvényt, amelyben a típus korábban található. Az alábbi kód egy áthelyezett típus
Exampleattribútumát mutatja.[assembly:TypeForwardedToAttribute(Example::typeid)][assembly:TypeForwardedToAttribute(typeof(Example))]Állítsa össze a szerelvényt, amely most tartalmazza a típust.
Fordítsa újra azt a szerelvényt, amelyben a típus korábban volt, és helyezzen el hivatkozást arra a szerelvényre, amely most tartalmazza a típust. Ha például egy C#-fájlt állít össze a parancssorból, a Hivatkozások (C# fordító beállításai) beállítással adja meg a típust tartalmazó szerelvényt. A C++-ban a forrásfájl #using irányelvével adja meg a típust tartalmazó szerelvényt.
C# típusú továbbítási példa
A fenti példaleírást folytatva képzelje el, hogy fejleszti a Utility.dll-t, és van egy Example osztálya. A Utility.csproj egy alapszintű osztálykódtár:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsing>true</ImplicitUsing>
</PropertyGroup>
</Project>
Az Example osztály néhány tulajdonságot és felülbírálást Object.ToStringbiztosít:
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}";
}
Képzelje el, hogy van egy fogyasztó projekt, amely a Fogyasztói szerelvényben jelenik meg. Ez a fogyasztó projekt a segédprogram-szerelvényre hivatkozik. Például példányosítja az Example objektumot, és a konzolra írja a Program.cs fájlban:
using System;
using Common.Objects;
Example example = new();
Console.WriteLine(example);
Amikor a fogyasztó alkalmazás fut, az Example objektum állapota fog megjelenni. Jelenleg nincs típustovábbítás, mivel a Consuming.csproj a Utility.csprojra hivatkozik. A segédprogram-szerelvény fejlesztői azonban úgy döntenek, hogy újrabontás részeként eltávolítják az Example objektumot. Ez a típus egy újonnan létrehozott Common.csproj-ba kerül.
E típus eltávolításával a segédprogram-szerelvényből, a fejlesztők megszakítást okozó változást vezetnek be. Az összes felhasználó projekt megszakad, amikor a legújabb segédprogram-szerelvényre frissülnek.
Ahelyett, hogy a fogyasztó projekteknek új hivatkozást kellene hozzáadniuk a Közös szerelvényhez, továbbíthatja a típust. Mivel ezt a típust eltávolították a Utility összeszerelésből, a Utility.csproj hivatkozni kell a Common.csproj-re.
<ItemGroup>
<ProjectReference Include="..\Common\Common.csproj" />
</ItemGroup>
Az előző C# projekt most az újonnan létrehozott Közös szerelvényre hivatkozik. Ez lehet egy PackageReference vagy egy ProjectReference. A segédprogram-szerelvénynek meg kell adnia a típustovábbítási információkat. Konvenciók szerint a továbbítási deklarációk általában egyetlen, nevesített TypeForwardersfájlba vannak beágyazva, vegye figyelembe a következő TypeForwarders.cs C#-fájlt a Segédprogram-szerelvényben :
using System.Runtime.CompilerServices;
using Common.Objects;
[assembly:TypeForwardedTo(typeof(Example))]
A Utility szerelvény a Common szerelvényre hivatkozik, és továbbítja a Example típust. Ha a Utility assembly-t típustovábbítási deklarációkkal kívánja lefordítani, és a Utility.dll-t a Felhasználói binbe helyezi, a felhasználói alkalmazás fordítás nélkül is működni fog.