AppDomain.AssemblyResolve
イベントを購読する必要があります。そこには、他のディレクトリに欠落しているアセンブリがないかどうかチェックするためにリダイレクトすることができます。
public static object CreateInstance()
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += MyResolveEventHandler;
var assm = Assembly.LoadFrom("full.path.to.asm"));
var objType = assm.GetType("MyType", true);
var obj = Activator.CreateInstance(objType);
}
private static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args)
{
if (args.Name == "SomeAssemblyIntheOtherFolder")
{
var path = Path.Combine(Path.GetDirectoryName("full.path.to.asm"), "SomeAssemblyIntheOtherFolder.dll");
return Assembly.LoadFrom(path);
}
return null;
}
更新:第二のオプションは、あなたのアプリにリダイレクト結合アセンブリを追加で、これは他のアプリケーションは、あなたが持っているDLLの新しいバージョンの代わりにコンパイルされ、彼らはどこにバージョンを使用します。
これはライブラリCommon.Logging.dll
で行われている例ですが、これをapp.configファイルに入れます。これが何をするか
<?xml version="1.0" encoding="utf-8"?>
<configuration>
...
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Common.Logging" publicKeyToken="af08829b84f0328e" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.2.0.0" newVersion="3.2.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
はだけではなく、彼らが構築されたWHEREバージョンの3.2.0.0
を使用する0.0.0.0
と3.2.0.0
間Common.Logging.dll
ライブラリのすべてのバージョンを参照するために構築されたプログラムにロードされているすべてのアセンブリを引き起こすことです。
AssemblyResolveイベントについて、何か新しいことを学んだことありがとう! – amnesia