2012-04-19 4 views
0

両方が、私はすでに次のシナリオの作業持っているAから:アセンブリA.exeは、ダイナミック/ランタイムアセンブリCのロードをCと参照B

  • を:呼び出しのWinFormsアプリケーション。
  • アセンブリB.dll:クラスライブラリはAでハード参照されています。
  • アセンブリC.dll:実行時にコンパイルされ、B(クラスはBクラスを継承します)。

A.exeは、実行時にC.dllにいくつかのコードをコンパイルするアセンブリをロードし、私はDLLとしてディスクにCをコンパイルする場合、それは同じフォルダ内にB.dll拾っ((B.BaseClass) C.DerivedClass).BaseMethod();

を起動します。しかし、私はC.dllをディスクに書きたくない。

これを達成するにはどのような方法が最適でしょうか?

答えて

1

私は通常、この(などのProgram.csまたはApp.xaml.csのように、どこかに早くあなたのアプリ内に、AssemblyResolveを登録する)ような何か:

//Since we'll be dynamically loading assemblies at runtime, we need to add an appropriate resolution path 
    //Otherwise weird things like failing to instantiate TypeConverters will happen 
    AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; 

private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
{ 
    var domain = (AppDomain)sender; 

    foreach (var assembly in domain.GetAssemblies()) 
    { 
     if (assembly.FullName == args.Name) 
      return assembly; 
    } 

    return null; 
} 
+0

感謝を。私はあなたが言っているものを手に入れますが、その方法が何をしているのか分かりません。このイベントがトリガされるとき、私のコードは、現在のappdomainにすでにロードされているアセンブリにアクセスする方法を実行時に知らせるべきではありませんか?私はあなたのソリューションをより良く理解しようとするので、リフレクションには新しいです。 –

+0

ところで、私は常に 'C'が呼び出される前にロードされていることを確認するためにAssembly Bからオブジェクトをインスタンス化します。それが適切かどうかはわかりません。 –

+0

これは既にロードされている場合にBを提供する良い方法です。もしそうでなければ、あなたは 'Assembly.LoadFile(string Path)'ハンドラでそれを行うことができます。 – Seb