2009-09-22 182 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的同一個文件夾中可用。