C#Bug?使用通用类型加载装配

时间:2011-06-18 09:10:33

标签: c# assemblies

我有一个类动态加载程序集:

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

然后另一个类在该程序集上运行测试:

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

加载的程序集引用同一文件夹中的其他程序集 [Debug \ Tests] ,加载程序集的程序位于 [Debug] 文件夹中。

加载的程序集(CalcSpecAsm):

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

        }
    }

引用的Assembly(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>

如果我删除了泛型arg ICalc并在构造函数中启动它,那么它的工作原理很完美,但这不是我想要的。

但是:如果我将loaderAssembly程序复制到 [Debug \ Test] 然后运行它,一切正常。

如何解决问题及其原因?

1 个答案:

答案 0 :(得分:3)

从其他位置加载程序集时,可能会收到错误,指出无法加载程序集或无法加载其依赖项。

这意味着在加载程序集时.Net Runtime无法解析程序集的所有依赖项。

所以你需要提供一种方法来解决这个问题。

首先,您必须将解决方案事件添加到您的appdomain,就像这样

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

然后在那种情况下,您将不得不加载您的依赖项。

    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;
    }

希望这会有所帮助。