Delen via


Typverwijzing in de gemeenschappelijke taalruntime

Met type doorsturen kunt u een type naar een andere assembly verplaatsen zonder dat u toepassingen die de oorspronkelijke assembly gebruiken, opnieuw hoeft te compileren.

Stel dat een toepassing de klasse gebruikt in een assembly met de Example naam Utility.dll. De ontwikkelaars van Utility.dll kunnen besluiten om de assembly te herstructureren en in het proces kunnen ze de Example klasse naar een andere assembly verplaatsen. Als de oude versie van Utility.dll wordt vervangen door de nieuwe versie van Utility.dll en de bijbehorende assembly, mislukt de toepassing die gebruikmaakt van de Example klasse omdat de Example klasse niet kan worden gevonden in de nieuwe versie van Utility.dll.

De ontwikkelaars van Utility.dll kunnen dit voorkomen door aanvragen voor de Example klasse door te sturen met behulp van het TypeForwardedToAttribute kenmerk. Als het kenmerk is toegepast op de nieuwe versie van Utility.dll, worden aanvragen voor de Example klasse doorgestuurd naar de assembly die nu de klasse bevat. De bestaande toepassing blijft normaal functioneren, zonder hercompilatie.

Een type doorsturen

Er zijn vier stappen voor het doorsturen van een type:

  1. Verplaats de broncode voor het type van de oorspronkelijke assembly naar de doelassembly.

  2. Voeg in de assembly waarin het type zich bevond, een TypeForwardedToAttribute toe voor het type dat is verplaatst. De volgende code toont het kenmerk voor een type met de naam Example dat is verplaatst.

     [assembly:TypeForwardedToAttribute(Example::typeid)]
    
     [assembly:TypeForwardedToAttribute(typeof(Example))]
    
  3. Compileer de assembly die nu het type bevat.

  4. Hercompileer de assembly waar het type zich eerder bevond, met een verwijzing naar de assembly die nu het type bevat. Als u bijvoorbeeld een C#-bestand compileert vanaf de opdrachtregel, gebruikt u de optie Verwijzingen (C#-compileropties) om de assembly op te geven die het type bevat. Gebruik in C++de #using-instructie in het bronbestand om de assembly op te geven die het type bevat.

Voorbeeld van het doorsturen van C#-type

Als u verdergaat met de hierboven beschreven voorbeeldbeschrijving, stelt u zich voor dat u de Utility.dllontwikkelt en u een Example klas hebt. De Utility.csproj is een basisklassebibliotheek:

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

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

</Project>

De Example klasse biedt enkele eigenschappen en overschrijvingen 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}";
}

Stel nu dat er een consumeerproject is en dat het wordt vertegenwoordigd in de Consumer assembly. Dit verbruikende project verwijst naar de Utility assembly. Als voorbeeld wordt het Example object geïnstitueert en naar de console geschreven in het Program.cs-bestand :

using System;
using Common.Objects;

Example example = new();

Console.WriteLine(example);

Wanneer de verbruikende app wordt uitgevoerd, zal de status van het Example object worden weergegeven. Op dit moment is er geen sprake van typeforwarding omdat de Consuming.csproj verwijst naar de Utility.csproj. De ontwikkelaar van de Utility-assembly besluit echter het Example object te verwijderen als onderdeel van een herstructurering. Dit type wordt verplaatst naar een zojuist gemaakte Common.csproj.

Door dit type te verwijderen uit de Utility-assembly , introduceren de ontwikkelaars een belangrijke wijziging. Alle projecten die afhankelijk zijn van de nieuwste Utility-assembly zullen problemen ondervinden wanneer ze worden bijgewerkt.

In plaats van dat de verbruikende projecten een nieuwe verwijzing naar de algemene assembly moeten toevoegen, kunt u het type doorsturen. Omdat dit type is verwijderd uit de assembly Utility, moet u de Utility.csproj refereren aan Common.csproj:

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

Het voorgaande C#-project verwijst nu naar de zojuist gemaakte Common-assembly . Dit kan een PackageReference of een ProjectReference zijn. De Assembly utility moet de informatie over het doorsturen van het type opgeven. Door conventie worden type forward-declaraties meestal ingekapseld in één bestand met de naam TypeForwarders, overweeg het volgende TypeForwarders.cs C#-bestand in de hulpprogramma-assembly :

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

[assembly:TypeForwardedTo(typeof(Example))]

De Utility assembly verwijst naar de Common assembly en stuurt het Example type door. Als u de Assembly utility wilt compileren met de declaraties voor doorsturen van het type en de Utility.dll in de opslaglocatie wilt neerzetten, werkt de verbruikende app zonder te worden gecompileerd.

Zie ook