型転送を使用すると、元のアセンブリを使用するアプリケーションを再コンパイルしなくても、型を別のアセンブリに移動できます。
たとえば、アプリケーションが Utility.dllという名前のアセンブリで Example
クラスを使用するとします。
Utility.dll の開発者は、アセンブリのリファクタリングを決定し、その過程で、Example
クラスを別のアセンブリに移動する可能性があります。
Utility.dll の古いバージョンが新しいバージョンの Utility.dll とそのコンパニオン アセンブリに置き換えられた場合、Example
クラスを使用するアプリケーションは、新しいバージョンのUtility.dllでExample
クラスを見つけることができないため、失敗します。
Utility.dll の開発者は、TypeForwardedToAttribute属性を使用して、Example
クラスの要求を転送することでこれを回避できます。 属性が新しいバージョンの Utility.dllに適用されている場合、 Example
クラスの要求は、クラスを含むアセンブリに転送されます。 既存のアプリケーションは、再コンパイルせずに正常に機能し続けます。
型を転送する
型を転送するには、次の 4 つの手順があります。
型のソース コードを元のアセンブリから変換先アセンブリに移動します。
以前の型が配置されていたアセンブリで、移動された型の TypeForwardedToAttribute を追加します。 次のコードは、移動された
Example
という名前の型の属性を示しています。[assembly:TypeForwardedToAttribute(Example::typeid)]
[assembly:TypeForwardedToAttribute(typeof(Example))]
型を含むアセンブリをコンパイルします。
型が格納されているアセンブリを再コンパイルし、型を含むアセンブリへの参照を指定します。 たとえば、コマンド ラインから C# ファイルをコンパイルする場合は、 References (C# コンパイラ オプション) オプション を使用して、型を含むアセンブリを指定します。 C++ では、ソース ファイルの #using ディレクティブを使用して、型を含むアセンブリを指定します。
C# 型転送の例
前述の説明の例に引き続き、Utility.dllを開発していて、Example
クラスがあるとします。
Utility.csproj は基本的なクラス ライブラリです。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsing>true</ImplicitUsing>
</PropertyGroup>
</Project>
Example
クラスには、いくつかのプロパティとオーバーライド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}";
}
次に、消費しているプロジェクトがあり、 コンシューマー アセンブリで表されていることを想像してください。 この使用するプロジェクトは、 ユーティリティ アセンブリを参照します。 たとえば、 Example
オブジェクトをインスタンス化し、 Program.cs ファイル内 のコンソールに書き込みます。
using System;
using Common.Objects;
Example example = new();
Console.WriteLine(example);
使用しているアプリを実行すると、 Example
オブジェクトの状態が出力されます。 この時点では、 Consuming.csproj が Utility.csproj を参照する場合、型転送はありません。 ただし、 ユーティリティ アセンブリの開発者は、リファクタリングの一環として Example
オブジェクトを削除することにしました。 この型は、新しく作成された Common.csproj に移動されます。
ユーティリティ アセンブリからこの型を削除することで、開発者は破壊的変更を導入しています。 使用しているすべてのプロジェクトは、最新の ユーティリティ アセンブリに更新すると中断されます。
使用しているプロジェクトに 共通 アセンブリへの新しい参照の追加を要求する代わりに、型を転送できます。 この型は ユーティリティ アセンブリから削除されたため、 Utility.csproj で Common.csproj を参照する必要があります。
<ItemGroup>
<ProjectReference Include="..\Common\Common.csproj" />
</ItemGroup>
上記の C# プロジェクトは、新しく作成された 共通 アセンブリを参照するようになりました。 これは、 PackageReference
または ProjectReference
のいずれかです。
ユーティリティ アセンブリは、型転送情報を提供する必要があります。 慣例により、型順方向宣言は通常、TypeForwarders
という名前の単一ファイルにカプセル化されます。ユーティリティ アセンブリ内の次の TypeForwarders.cs C# ファイルを考慮してください。
using System.Runtime.CompilerServices;
using Common.Objects;
[assembly:TypeForwardedTo(typeof(Example))]
ユーティリティ アセンブリは Common アセンブリを参照し、Example
型を転送します。 型転送宣言を使用して Utility アセンブリをコンパイルし、 Utility.dll を 使用 bin にドロップする場合、使用しているアプリはコンパイルされずに動作します。
こちらも参照ください
.NET