我有4个集会:
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路径中访问程序集。为什么会这样,我怎么能改变这个?
答案 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)
您是否尝试将所有程序集放在同一目录中?