2016-11-09 1 views
0

C#:動的に読み込まれたアセンブリ内の動的に読み込まれたアセンブリの依存関係の検索ディレクトリを変更する方法はありますか

別のアプリケーション(別のディレクトリ)との統合では、アセンブリの1つを動的にロードしてから、Activatorを使用してそのアセンブリからオブジェクトをインスタンス化しています。ターゲットアセンブリをロード罰金が、オブジェクトのインスタンスを作成するとき、それは動的にいくつかの追加の依存関係をロードしようと、それは我々のアプリのディレクトリにそれらの新しいバージョンを見つけたので、失敗します。

var assm = Assembly.LoadFrom("full.path.to.asm")); 
var objType = assm.GetType("MyType", true); 
var obj = Activator.CreateInstance(objType); 

細かいassm負荷、 objTypeが得られる。例外はobjをアクティブにします。これは古いバージョンのアセンブリ(それはそのディレクトリにあります)に依存しているためですが、まずアプリケーションディレクトリの新しいものを見つけて間違った署名であると不平を言います。

Environment.CurrentDirectoryを先に設定しようとしましたが、何の違いもありませんでした。

答えて

1

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.03.2.0.0Common.Logging.dllライブラリのすべてのバージョンを参照するために構築されたプログラムにロードされているすべてのアセンブリを引き起こすことです。

+0

AssemblyResolveイベントについて、何か新しいことを学んだことありがとう! – amnesia

関連する問題