动态加载的DLL的程序集引用

时间:2009-10-26 13:33:44

标签: c# reflection assemblies reference

我有4个集会:

  1. Tester.exe
  2. ToyInterface.dll
  3. ToyFactory.dll - >参考(ToyInterface.dll)
  4. Toy.dll - >参考(ToyInterface.dll)
  5. Tester.exe

    internal ICollection<string> Scan(string path){
      return ToyCollection = _reportFactoryType.GetMethod(FACTORY_GET_TOYS).
                                Invoke(_ToyFactory, null);
    }
    

    ToyFactory.dll

    ...try
    {
    // Load assembly:
        Assembly asm = Assembly.LoadFrom(fileFullPath);
        // Reflect ToyInterface types:
        IEnumerable<Type> types = asm.GetExportedTypes();
    }
    

    我收到异常

      

    无法加载文件或程序集   'ToyInterface,版本= 1.0.0.0,   Culture = neutral,PublicKeyToken = null'   或其中一个依赖项。系统   找不到该文件   指定 “:” ToyInterface,   版本= 1.0.0.0,文化=中立,   公钥=空

    来自fuslogvw.exe的绑定信息显示在Tester.exe Enviroment路径中访问程序集。为什么会这样,我怎么能改变这个?

3 个答案:

答案 0 :(得分:1)

您没有指定,但我认为Toy.exe也依赖于所有其他dll?对?如果不是,则编译过程不会将它们复制到Toy.exe的运行可执行文件目录中。检查一下durectory并确保所有三个dll都在那里,并在最新的编译时间标记日期时间......

如果所有这些都是kewl,则可能是ToyInterface.dll依赖于Visual Studio开发文件夹中的其他一些dll(未提及)但未被复制到运行时文件夹...

如果你动态加载这些其他dll,不要错误地假设它们自己加载自己的依赖dll。所有Dependent Dll都是根据可执行程序集的Base Code文件夹(它来自的文件夹)加载的,而不是Assembly.LoadFrom方法可能正在执行的dll的文件夹...所以如果你想要一个dll要从Toy.exe的加载文件夹(或该文件夹的s子目录)以外的其他位置加载,请尝试在Assembly.LoadFrom()方法中指定dll的完全限定绝对路径,并查看如果那可以解决问题。

答案 1 :(得分:1)

我发现了问题! 看来我一直在遭遇DLL绑定地狱。 :(

This blog post 帮助我发现我需要使用Assembly.LoadFrom()函数而不是Assembly.LoadFile()。 现在,Aseembly及其依赖项正在正确的目录中进行探测。

谢谢大家的帮助!

答案 2 :(得分:0)

您是否尝试将所有程序集放在同一目录中?