Předávání typů v modulu CLR (Common Language Runtime)

Předávání typů umožňuje přesunout typ do jiného sestavení bez nutnosti překompilovat aplikace, které používají původní sestavení.

Předpokládejme například, že aplikace používá Example třídu v sestavení s názvem Utility.dll. Vývojáři Utility.dll se mohou rozhodnout refaktorovat sestavení a v procesu, který mohou přesunout Example třídu do jiného sestavení. Pokud je stará verze Utility.dll nahrazena novou verzí Utility.dll a jeho doprovodné sestavení, aplikace, která používá Example třídu, selže, protože nemůže najít Example třídu v nové verzi Utility.dll.

Vývojáři Utility.dll se tomu můžou vyhnout předáváním požadavků pro Example třídu pomocí atributu TypeForwardedToAttribute . Pokud byl atribut použit na novou verzi Utility.dll, požadavky na Example třídu jsou předány sestavení, které nyní obsahuje třídu. Stávající aplikace nadále funguje normálně bez rekompilace.

Přeposlání typu

Přeposílání typu je potřeba provést čtyřmi kroky:

  1. Přesuňte zdrojový kód pro typ z původního sestavení do cílového sestavení.

  2. V sestavení, kde se typ použitý k umístění, přidejte TypeForwardedToAttribute pro typ, který byl přesunut. Následující kód ukazuje atribut pro typ, Example který byl přesunut.

     [assembly:TypeForwardedToAttribute(Example::typeid)]
    
     [assembly:TypeForwardedToAttribute(typeof(Example))]
    
  3. Zkompilujte sestavení, které nyní obsahuje typ.

  4. Překompilujte sestavení, ve kterém se typ nachází, s odkazem na sestavení, které nyní obsahuje typ. Pokud například kompilujete soubor jazyka C# z příkazového řádku, použijte možnost Odkazy (možnosti kompilátoru jazyka C#) k určení sestavení, které obsahuje daný typ. V jazyce C++ použijte direktivu #using ve zdrojovém souboru k určení sestavení, které obsahuje typ.

Příklad předávání typu C#

Pokračujte z výše uvedeného popisu v příkladu, představte si, že vyvíjíte Utility.dll a máte Example třídu. Utility.csproj je základní knihovna tříd:

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

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

</Project>

Třída Example poskytuje několik vlastností a přepsání 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}";
}

Teď si představte, že existuje náročný projekt a je reprezentován v sestavení Příjemce . Tento projekt využívá odkaz na sestavení Utility . Například vytvoří instanci objektu Example a zapíše ho do konzoly v souboru Program.cs :

using System;
using Common.Objects;

Example example = new();

Console.WriteLine(example);

Při spuštění aplikace, která využívá, vypíše stav objektu Example . V tomto okamžiku neexistuje žádný typ předávání, protože Consuming.csproj odkazuje na Utility.csproj. Vývojáři sestavení Utility se však rozhodnou odebrat Example objekt jako součást refaktoringu. Tento typ se přesune do nově vytvořeného souboru Common.csproj.

Odebráním tohoto typu ze sestavení Utility zavádějí vývojáři zásadní změnu. Všechny náročné projekty se přeruší při aktualizaci na nejnovější sestavení nástroje .

Místo toho, aby spotřebovávají projekty k přidání nového odkazu na společné sestavení, můžete typ předat. Vzhledem k tomu, že byl tento typ odebrán ze sestavení Utility , budete muset mít nástroj Utility.csproj odkaz na Common.csproj:

<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>

Předchozí projekt jazyka C# teď odkazuje na nově vytvořené společné sestavení. Může to být buď a PackageReference nebo .ProjectReference Sestavení Utility musí poskytnout informace o předávání typu. Deklarace předávání typu konvence jsou obvykle zapouzdřeny v jednom souboru s názvem TypeForwarders, zvažte následující TypeForwarders.cs C# soubor v sestavení Utility :

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

[assembly:TypeForwardedTo(typeof(Example))]

Sestavení Nástroje odkazuje na společné sestavení a předá Example typ. Pokud chcete sestavení Utility zkompilovat s deklaracemi předávání typů a vypustit Utility.dll do přihrádky, bude spotřebová aplikace fungovat bez kompilace.

Viz také