C# には、アプリケーション ディレクトリ内にない場合に外部 dll をロードする ResolveEventHandler イベントがあります。
winform アプリケーションで使用するには、次のように Program.cs Main() 関数にイベントを登録します。
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveAssembly);
そして、イベントが発生するたびに呼び出される ResolveAssembly 関数があります。
static Assembly ResolveAssembly(object sender, ResolveEventArgs args)
{
//MessageBox.Show(String.Format("Assembly {0} is missing", args.Name));
//This handler is called only when the common language runtime tries to bind to the assembly and fails.
//Retrieve the list of referenced assemblies in an array of AssemblyName.
Assembly MyAssembly, objExecutingAssemblies;
string strTempAssmbPath = "";
string AssemblyName = new AssemblyName(args.Name).Name;
objExecutingAssemblies = Assembly.GetExecutingAssembly();
AssemblyName[] arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies();
//Loop through the array of referenced assembly names.
foreach (AssemblyName strAssmbName in arrReferencedAssmbNames)
{
//Check for the assembly names that have raised the "AssemblyResolve" event.
if (strAssmbName.Name == AssemblyName)
{
//Build the path of the assembly from where it has to be loaded.
strTempAssmbPath = @"C:\PowerVision\libraries\" + AssemblyName + ".dll";
break;
}
}
//Load the assembly from the specified path.
MyAssembly = Assembly.LoadFrom(strTempAssmbPath);
//Return the loaded assembly.
return MyAssembly;
}
問題は、このイベントをクラス ライブラリに追加/呼び出しするにはどうすればよいかということです。
外部 DLL への参照が 3 つあるクラス ライブラリ (DLL) があります。これらの dll をアプリケーション ディレクトリにコピーしたくないし、アプリケーションのサブディレクトリに配置したくありません。これらの DLL は、特定の外部フォルダーに保持する必要があります (したがって、イベントを使用します)。
問題は、DLL (クラス ライブラリ) のどこにこのイベント登録を配置するかわからないことです。
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveAssembly);