私も同じ問題を抱えていて、この方法で解決しました。IAssembyInitializer
メソッドだけでインターフェースを定義しますvoid Initialize()
。ロードされた直後にコードを実行するすべてのアセンブリで、このインターフェイスを実装するクラスを定義します。このインターフェイスを実装するアセンブリ内のクラスを指定するための属性を定義します(そうでない場合は、Reflectionで見つけることができますが、この方法で選択しました)。
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
public class AssemblyInitializerAttribute : Attribute
{
AssemblyInitializerAttribute ()
{
}
AssemblyInitializerAttribute (string typeName)
{
TypeName = typeName;
}
public string TypeName;
}
属性は、次のようにAssemblyInfoに設定されます。
[assembly: AssemblyInitializerAttribute ("MyNamespace.AnAssemblyInitializer")]
最後に、アプリケーションのメインアセンブリで、すべての初期化を実行するメソッドをAssemblyLoadイベントに登録します。
AppDomain.CurrentDomain.AssemblyLoad += new AssemblyLoadEventHandler(NewAssemblyLoaded);
static void NewAssemblyLoaded(object sender, AssemblyLoadEventArgs args)
{
Assembly anAssembly = args.LoadedAssembly;
AssemblyInitializerAttribute[] initializers = (AssemblyInitializerAttribute[])anAssembly .GetCustomAttributes(typeof(AssemblyInitializerAttribute), false);
foreach (AssemblyInitializerAttribute anInit in initializers)
{
Type initType = anInit.TypeName != null ? anAssembly.GetType(anInit.TypeName) : null;
if (initType != null && initType.GetInterface("IAssemblyInitializer") != null)
{
IAssemblyInitializer anInitializer = (IAssemblyInitializer)Activator.CreateInstance(initType);
anInitializer.Initialize();
}
}
}