2010-07-18 39 views
2

如何獲取當前正在執行的程序集中或未在mscorlib.dll中定義的類型的Type類的實例?無法獲得當前正在執行的程序集中未定義的類型的Type類的實例

一)也就是說,我在組裝CSharpSnapIn.dll,位於E:\CSharpSnapIn.dll定義的類類型someType,但由於某些原因,當我嘗試指定此程序集的絕對路徑,我得到一個異常:

Type t = Type.GetType("someType, E:\\CSharpSnapIn.dll"); // exeception 

二)我也通過把CSharpSnapIn.dll\bin\debug目錄中當前運行的應用的嘗試,但我仍然得到一個異常:

Type t = Type.GetType("someType, CSharpSnapIn.dll"); // exeception 

感謝名單

編輯:

1)我已經聲明另一個類類型someType2(內CsharpSnapIn.dll),這一次它的工作:

Type.GetType("someType2, CSharpSnapIn"); 

差異與someType2之間someTypesomeType實現一個接口在外部程序集asmIn中聲明,但是這不應該引起異常,因爲CsharpSnapIn.dll確實對asmIn有參考?!

2)

需要注意的是,大會並不需要 首先裝載,只要 集解析器可以找到它

換句話說,調用Type.GetType()首次加載一個程序集,然後創建一個Type實例?

3)

大會有權通過 探測發現,所以它必須是在 bin目錄按你的第二個 例子。如果它是具有 強名稱的組件,則必須提供所有 的詳細信息。

所以你說我們不能指定使用Type.GetType()絕對路徑(一個組裝),而是裝配需要駐留在bin目錄裏面?

回答

4

您需要提供程序集名稱 - 不是包含它的文件。

例如:

Type t = Type.GetType("someType, CSharpSnapIn"); 

大會有權通過探測發現,所以它必須是在bin目錄按你的第二個例子。如果它是一個名字很強的組合,你必須提供所有的細節。請注意,someType此處必須完全限定名稱空間。

請注意,程序集不是需要首先加載,只要程序集解析器可以找到它。例如,如果程序集與當前正在執行的程序集位於同一個目錄中,那麼在大多數情況下都可以。如Darin所說,另一種方法是直接加載程序集 - 儘管根據我的經驗,顯式加載程序集時有相當多的「陷阱」,特別是如果你在不同位置有兩個程序集都依賴於第三次大會。確保你只得到第三個程序集加載一次可能會很棘手。

你需要LoadFileLoadFrom等。這裏之間做出選擇從MSDN一些言論:

使用的LoadFile方法來加載和 檢查具有相同 身份組件,但位於不同的 路徑。與LoadFrom方法 一樣,LoadFile不會將文件 加載到LoadFrom上下文中,並且 不會使用加載路徑 解決依存關係。 LoadFile在此限制場景中很有用,因爲LoadFrom 不能用於加載具有相同身份但不同 路徑的程序集;它只會加載第一個這樣的組件。

+0

你可以看到編輯在原來的職位? – flockofcode 2010-07-18 19:16:40

+1

我很確定,如果你使用Type.GetType(assemblyAualifiedName),你可以傳遞程序集名稱 – 2010-07-18 20:16:09

+1

@Rune FS的絕對文件路徑,我非常肯定你不能。正如@Jon所說,要使Type.GetType工作,程序集需要通過CLR使用的標準探測啓發式來解析(例如,如果程序集位於ASP.NET應用程序的'bin'文件夾中或與控制檯和WinForms應用程序的可執行文件相同的文件夾)。 – 2010-07-18 20:50:13

5

您需要首先加載組件:

Type t = Assembly 
    .LoadFrom(@"e:\CSharpSnapIn.dll") 
    .GetType("SomeNs.SomeType", true); 
相關問題