2011-06-18 20 views
2

私はそうのような動的にアセンブリをロードするクラスがあります。C#Bug?ジェネリック型を持つアセンブリをロード

foreach (var cspecType in asm.GetTypes()) 
    { 
     RunTestOnType(cspecType); 
    } 

ロードされたアセンブリ参照他のアセンブリで:

Assembly asm = Assembly.LoadFile(args[1]);   
    runner.RunTestOnAssembly(asm); 

はその後、別のクラスは、そのアセンブリでテストを実行します同じフォルダ [Debug \ Tests]とアセンブリを読み込むプログラムは、 [Debug]フォルダにあります。

読み込まれたアセンブリ(CalcSpecAsm):

public class CalcSpec : CSpecFacade<ICalc> 
    { 
     public CalcSpec() 
     : base(new Calc()) 
     { 

     } 
    } 

参照アセンブリ(CalcAsm):

public class Calc : ICalc 
    { 
    /// <summary> 
    /// Initalisation constructor 
    /// resets the Total value. 
    /// </summary> 
    public Calc() 
    { 
     Total = 0; 
    } 
    ..... 

CSpecFacadeは別のアセンブリで参照されています。

今、問題は、アセンブリのCalcSpecAsmをロードすると、GetTypes()でアセンブリのloaderErrorが取得され、CalcAsmアセンブリへの参照を解決できないということです。

問題は、このコード行です:public class CalcSpec : CSpecFacade<ICalc>

私はジェネリック引数ICalcを削除し、コンストラクタでそれをinitize場合、それは完璧に動作しますが、それは私が後だものではないのです。

ただし、loaderAssemblyプログラムを[Debug \ Test]にコピーして実行すると、すべて正常に動作します。

この問題を解決する方法とその原因は何ですか?

+1

アセンブリのロード方法が表示されていません... –

+0

アセンブリをロードする方法を示すポストを編集しました – BartoszAdamczewski

+1

ここにバグはありません。その動作は期待されており、どのように設計されています。 – leppie

答えて

3

他の場所からアセンブリをロードすると、アセンブリをロードできなかったり、依存関係をロードできなかった可能性があります。

これは、アセンブリをロードするときに、.NETランタイムがアセンブリのすべての依存関係を解決できなかったことを意味します。

これを解決する方法を提供する必要があります。

まず、あなたは、そのイベントに、あなたの依存関係をロードする必要があります。この

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); 

のようなあなたのAppDomainに解決イベントを追加する必要があります。

Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
    { 

     //Build the path of the assembly from where it has to be loaded.     
     assemblyPath = System.IO.Path.Combine("your path", args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll"); 
     assembly = Assembly.LoadFrom(assemblyPath); 

     //Return the loaded assembly. 
     return assembly; 
    } 

希望すると、これが役立ちます。

関連する問題