2009-09-22 68 views
4

如果我运行此代码:.Assembly/GetExportedTypes抛出FileNotFoundException异常

var myAsm = typeof(MyType).Assembly; 
var types = myAsm.GetExportedTypes(); 

我得到:

System.IO.FileNotFoundException : Could not load file or assembly .... 

其中列出的依赖程序集。但是,如果我这样做:

var myAsm = Assembly.LoadFrom(...); // DLL containing the same assembly as above 
var types = myAsm.GetExportedTypes(); 

它工作正常。

我真的更喜欢第一种技术,因为它更干净...为什么我需要加载已经加载的DLL?有什么建议?

+0

首先想到的是DLL通常会延迟加载直到实际使用类型。你确定DLL已经被加载了吗? (你以前用过MyType吗?) – 2009-09-22 14:39:19

回答

1

你试过

System.Reflection.Assembly.GetExecutingAssembly(); 

或者

System.Reflection.Assembly.GetAssembly(typeof(MyType)); 

你的第二个作品是你在实际加载一个.dll的原因。当你调用typeof(MyType).Assembly时,它不知道应该使用哪个.dll反射。这就是为什么GetExecutingAssemblyGetAssembly(tyepof(MyType))应该工作。

+0

第一个不会给我正确的程序集。第二个给了我相同的FileNotFoundException。 – JoelFan 2009-09-22 14:46:04

3

这并不完全回答你的问题,但我只是有一个相关的问题,我想我会发布一些信息来帮助其他人可能偶然发现这一点!

Assembly具有

.LoadFile(string path) 

.LoadFrom(string path) 

LoadFile将抛出FileNotFoundException如果从某些远程(不一样执行DLL)文件夹加载组件。您需要使用LoadFrom你上面做;)

+0

只是想说这个帖子的THANKYOU! 我在自动化测试中添加了一些东西,突然构建失败,但所有测试都通过了。我们运行测试的PS脚本试图用GetExportedTypes()从DLL中取出测试列表,我们得到这个错误。问题是我们正在使用LoadFile(),我想它不会加载依赖关系的依赖关系或其他东西。无论如何,将LoadFile更改为LoadFrom可以修复它。 – 2017-04-04 16:58:04

0

如果要加载的大会,IS NOT的ExecutingAssembly,而该DLL有像MyProj.Interfaces或MyProj.BaseClasses或更低级别的对象引用Infragistics控件或类似的东西...这些DLL也必须在您加载最初的dll的同一个文件夹中可用。