私が開発中のフレームワークで、いくつかの従来のアセンブリ スキャン手法をバイパスしたいと考えています。
したがって、次のコントラクトを定義したとします。
public interface IModule
{
}
これは say に存在しますContracts.dll
。
ここで、このインターフェースのすべての実装を発見したい場合は、おそらく次のようにします。
public IEnumerable<IModule> DiscoverModules()
{
var contractType = typeof(IModule);
var assemblies = AppDomain.Current.GetAssemblies() // Bad but will do
var types = assemblies
.SelectMany(a => a.GetExportedTypes)
.Where(t => contractType.IsAssignableFrom(t))
.ToList();
return types.Select(t => Activator.CreateInstance(t));
}
良い例ではありませんが、十分でしょう。
現在、これらの種類のアセンブリ スキャン手法はパフォーマンスが非常に低く、すべて実行時に実行されるため、通常は起動時のパフォーマンスに影響します。
新しい DNX 環境では、ICompileModule
インスタンスをメタプログラミング ツールとして使用できるため、 の実装をプロジェクト内のフォルダーにバンドルして、ICompileModule
ファンキーCompiler\Preprocess
なことを実行させることができます。
私の目標は、ICompileModule
実装を使用して、代わりにコンパイル時に実行時に行う作業を行うことです。
- 私の参照 (コンパイルとアセンブリの両方) と現在のコンパイルで、インスタンス化可能なすべてのインスタンスを見つけます
IModule
- クラスを作成し、
ModuleList
各モジュールのインスタンスを生成する実装で呼び出します。
public static class ModuleList
{
public static IEnumerable<IModule>() GetModules()
{
yield return new Module1();
yield return new Module2();
}
}
そのクラスをコンパイル ユニットに追加すると、アタッチされているすべてのアセンブリを検索する代わりに、それを呼び出して、実行時にモジュールの静的リストを取得できます。基本的に、ランタイムではなくコンパイラで作業をオフロードしています。
プロパティを介してコンパイルのすべての参照にアクセスできることを考えるとReferences
、バイトコードへのアクセス、リフレクション用のアセンブリのロードなど、有用な情報を取得する方法がわかりません。 .
考え?