C# 动态加载DLL的程序集引用
我有4个组件:C# 动态加载DLL的程序集引用,c#,reflection,assemblies,reference,C#,Reflection,Assemblies,Reference,我有4个组件: Tester.exe ToyInterface.dll ToyFactory.dll-->引用(ToyInterface.dll) Toy.dll-->引用(ToyInterface.dll) Tester.exe internal ICollection<string> Scan(string path){ return ToyCollection = _reportFactoryType.GetMethod(FACTORY_GET_TOYS).
internal ICollection<string> Scan(string path){
return ToyCollection = _reportFactoryType.GetMethod(FACTORY_GET_TOYS).
Invoke(_ToyFactory, null);
}
内部ICollection扫描(字符串路径){
return-ToyCollection=\u reportFactoryType.GetMethod(FACTORY\u GET\u玩具)。
调用(_ToyFactory,null);
}
ToyFactory.dll
...try
{
// Load assembly:
Assembly asm = Assembly.LoadFrom(fileFullPath);
// Reflect ToyInterface types:
IEnumerable<Type> types = asm.GetExportedTypes();
}
…试试看
{
//加载组件:
Assembly asm=Assembly.LoadFrom(fileFullPath);
//反射到接口类型:
IEnumerable types=asm.GetExportedTypes();
}
我收到一个例外
无法加载文件或程序集
'ToyInterface,版本=1.0.0.0,
区域性=中性,PublicKeyToken=空'
或者它的一个依赖项。系统
找不到该文件
指定。“:”ToyInterface,
版本=1.0.0.0,区域性=中性,
PublicKeyToken=null
fuslogvw.exe中的绑定信息显示程序集是在Tester.exe环境路径中访问的。为什么会这样,我怎样才能改变这一点 是否尝试将所有程序集放在同一目录中?您没有指定,但我假设Toy.exe也依赖于所有其他DLL?正确的?因为如果不是,那么编译过程不会将它们复制到Toy.exe的run executable目录中。检查durectory,确保所有三个DLL都在那里,并且都是最新编译时的日期戳 如果只是kewl,那么可能是ToyInterface.dll依赖于Visual Studio开发文件夹中的某个其他dll(未提及),但未复制到运行时文件夹中 如果您正在动态加载这些其他DLL,请不要;不要错误地假设他们自己加载自己的依赖DLL。所有从属DLL都是基于可执行程序集的基本代码文件夹(从中加载的文件夹)加载的,而不是
程序集.LoadFrom
方法可能正在执行的DLL文件夹。。。因此,如果您希望从Toy.exe的load文件夹(或该文件夹的s子目录)以外的其他位置加载dll,请尝试在Assembly.LoadFrom()方法中指定dll的完全限定绝对路径,然后查看是否解决了问题。我发现了问题!
看来我一直在忍受地狱的折磨(
帮助我发现我需要使用Assembly.LoadFrom()
函数,而不是Assembly.LoadFile()
。
现在,正在正确的目录中探测Aseembly及其依赖项
谢谢大家的帮助!这就是重点。我不希望它们在同一个目录中。为什么测试仪和玩具必须在一起?当你编译Toy.exe时,如果它(或任何依赖的dll),具有对任何dll的引用,Visual Studio编译应将该dll全部放入输出目录中…除非其中一个dll已在GAC中注册…是这样吗?如果不希望dll位于同一输出文件夹中,则必须1)在GAC中注册它们。2) 动态加载它们,或者3)使用复杂的CLR加载程序版本策略配置文件。Charles,我正在动态加载它们。这就是重点。Tester.exe不依赖于ToyFactory.dll或Toy.dll。它们不会复制到Tester.exe文件夹。这就是为什么找不到它们。请解释“使用复杂的CLR加载程序版本策略配置文件”。?Toy.dll只知道ToyInterface.dll它是从ToyFactory.dll动态加载的,ToyFactory.dll也是从Tester.exe动态加载的。不知怎的,Toy.dll正在Tester.exe的环境路径中查找其依赖项。您误解了,所有程序集都加载到单个AppDomain和单个进程空间中,即加载toy.exe时最初创建的AppDomain/进程空间。因此,Toy.exe加载的文件夹是defualt加载文件夹。所以toy.dll无法加载任何内容。。。尽管加载其依赖项的代码行位于toy.dll中,但加载的始终是toy.exes的AppDomain和进程。由于您正在动态加载这些其他dll,请尝试在Assembly.LoadFrom()方法中显式指定dll的完整绝对路径,看看这是否可以解决问题。