概要
.NETでは、「アセンブリ+名前」の組み合わせで型の所在を検索します。 その結果、異なるアセンブリでまったく同じ名前の型を定義しても、それぞれ別の型として扱われます。 これは、人的ミスの削減や、悪意あるコードへの耐性につながる一方で、 型の定義場所を移動させたいときに困ります。
そこで.NETは、型の検索の際に、別のアセンブリに転送する仕組みを提供しています。 これを型フォワーディング(type forwarding: 型の転送)と呼びます。
サンプル
TypeForwardedTo属性
型フォワーディングには、TypeForwardedTo
属性(System.Runtime.CompilerServices
)というものを使います。
例えば、ActualLibraryという名前のライブラリがあって、この中に以下のようなクラスが定義されているとします。
public class Class1
{
public string Name => GetType().Assembly.GetName().Name + " / " + nameof(Class1);
}
このActualLibraryを参照して、以下のような.csファイルを含む、TypeForwardingLibraryという名前のライブラリを作ります。
using System.Runtime.CompilerServices;
[assembly: TypeForwardedTo(typeof(Class1))]
これで、アプリが「TypeForwardingLibraryにあるはずのClass1」を使おうとすると、 実際には「ActualLibraryで定義されたClass1」が返ってきます。
これで、例えば、「元々ライブラリAにあった型を、ライブラリBに移した」という場合でも、
AにTypeForwardedTo
属性を書いておけば、互換性を崩さずに型を移動できます。
で、型の転送ができて何が嬉しいかというと、主に2通りの用途が考えられます。
- モジュール分割
- バックポーティング