Remarque
L’accès à cette page requiert une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page requiert une autorisation. Vous pouvez essayer de modifier des répertoires.
Le transfert de type vous permet de déplacer un type vers un autre assembly sans avoir à recompiler les applications qui utilisent l’assembly d’origine.
Par exemple, supposons qu’une application utilise la Example
classe dans un assembly nommé Utility.dll. Les développeurs de Utility.dll peuvent décider de refactoriser l’assembly et, dans le processus, ils peuvent déplacer la Example
classe vers un autre assembly. Si l’ancienne version de Utility.dll est remplacée par la nouvelle version de Utility.dll et son assembly complémentaire, l’application qui utilise la Example
classe échoue, car elle ne peut pas localiser la Example
classe dans la nouvelle version de Utility.dll.
Les développeurs de Utility.dll peuvent éviter cela en transférant les demandes de la Example
classe à l’aide de l’attribut TypeForwardedToAttribute . Si l’attribut a été appliqué à la nouvelle version de Utility.dll, les demandes de la Example
classe sont transférées à l’assembly qui contient désormais la classe. L’application existante continue de fonctionner normalement, sans recompilation.
Transférer un type
Il existe quatre étapes pour transférer un type :
Déplacez le code source du type de l'assemblage d'origine vers l'assemblage de destination.
Dans l'assembly où le type était situé, ajoutez un TypeForwardedToAttribute pour le type qui a été déplacé. Le code suivant montre l’attribut d’un type nommé
Example
qui a été déplacé.[assembly:TypeForwardedToAttribute(Example::typeid)]
[assembly:TypeForwardedToAttribute(typeof(Example))]
Compilez l’assembly qui contient maintenant le type.
Recompilez l'assembly où le type se trouvait auparavant, avec une référence à l'assembly qui contient désormais le type. Par exemple, si vous compilez un fichier C# à partir de la ligne de commande, utilisez l’option Références (options du compilateur C#) pour spécifier l’assembly qui contient le type. En C++, utilisez la directive #using dans le fichier source pour spécifier l’assembly qui contient le type.
Exemple de transfert de type C#
Continuez à partir de l’exemple de description construit ci-dessus, imaginez que vous développez le Utility.dll et que vous avez une classe Example
. Utility.csproj est une bibliothèque de classes de base :
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsing>true</ImplicitUsing>
</PropertyGroup>
</Project>
La classe Example
fournit quelques propriétés et remplacements 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}";
}
Imaginez maintenant qu’il existe un projet consommant et qu’il est représenté dans l’assembly Consommateur . Ce projet utilisateur fait référence à l’assembly Utilitaire. Par exemple, il instancie l’objet Example
et l’écrit dans la console dans son fichier Program.cs :
using System;
using Common.Objects;
Example example = new();
Console.WriteLine(example);
Lorsque l’application consommatrice s’exécute, elle génère l’état de l’objet Example
. À ce stade, il n’existe aucun transfert de type, car Le fichier Consume.csproj fait référence à Utility.csproj. Toutefois, le développeur de l’assembly Utility décide de supprimer l’objet Example
dans le cadre d’une refactorisation. Ce type est déplacé vers un common.csproj nouvellement créé.
En supprimant ce type de l'assembly Utility, les développeurs introduisent un changement cassant. Tous les projets d'utilisation seront interrompus lors de la mise à jour vers la dernière version de l'assembly Utility.
Au lieu d’exiger que les projets d'utilisation ajoutent une nouvelle référence à l’assembly Common , vous pouvez transférer le type. Étant donné que ce type a été supprimé de l’assembly Utility, vous devez faire en sorte que Utility.csproj référence Common.csproj :
<ItemGroup>
<ProjectReference Include="..\Common\Common.csproj" />
</ItemGroup>
Le projet C# précédent fait désormais référence à l’assembly Commun nouvellement créé. Il pourrait s'agir d'un PackageReference
ou d'un ProjectReference
. L’assembly Utility doit fournir les informations de transfert de type. Par convention, les déclarations de transfert de type de convention sont généralement encapsulées dans un seul fichier nommé TypeForwarders
, considérez le fichier TypeForwarders.cs C# suivant dans l’assembly utilitaire :
using System.Runtime.CompilerServices;
using Common.Objects;
[assembly:TypeForwardedTo(typeof(Example))]
L’assembly Utility fait référence à l’assembly Common et transmet le type Example
. Si vous devez compiler l’assembly Utility avec les déclarations de transfert de type et déposer la dll Utility.dll dans le bac Consuming, l’application d'utilisation fonctionnera sans avoir besoin d'être compilée.