2010-10-24 35 views
7

我有使用Asssembly.LoadFrom方法加載程序集的程序。一段時間後,我嘗試使用Type.GetType從該程序集創建一個類型(使用AssemblyQualifiedName),但該方法返回null。如果我將它拋出異常,它告訴Type.GetType無法從已經加載的程序集中創建類型

無法加載文件或程序集「...」 或它的一個依賴。系統 找不到指定的文件。

但我確定已經加載完全相同的程序集(它顯示在AppDomain.CurrentDomain.GetAssemblies()列表中)。

任何人有一個想法可能是錯誤的和/或如何解決這個問題?

+0

這個方法c reates類型是從位於該程序集中的代碼調用的。 AFAIK,程序集只有正確加載才能執行任何代碼。 – 2010-10-24 17:27:27

回答

10

爲了理解爲什麼這不起作用,您需要了解「加載上下文」的問題。 Type.GetType只查看「Load」上下文。您加載到內存中的程序集位於「LoadFrom」上下文中。

要真正在加載上下文中獲取綁定以在加載上下文中查看程序集的唯一方法是使用AssemblyResolve事件並編寫代碼以返回正確的程序集。 AssemblyResolve事件在綁定失敗並且所有其他程序集查找未成功之前觸發。

有關加載上下文和使用LoadFrom時出現的問題的更多信息,請參見以下鏈接。

MSDN - http://msdn.microsoft.com/en-us/library/dd153782.aspx
AssemblyResolve - http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx
蘇珊·庫克 - http://blogs.msdn.com/b/suzcook/archive/2003/05/29/57143.aspx

+1

嘗試使用Assembly.Load(AssemblyName.GetAssemblyName(file))。程序集加載正常(程序的其餘部分似乎工作),但Type.GetType中的異常保持不變。 – 2010-10-24 17:58:00

+2

現在它工作了(在將程序集所在的目錄添加到app.config中之後)。感謝有關.NET的.NET領域的解釋,我對此毫無頭緒。 – 2010-10-24 18:26:34

+0

正確的,由GetAssemblyName返回的AssemblyName將爲您提供程序集的強名稱,但是當它傳遞給Assembly.Load時,將遵循常規程序集探測規則。正如你所指出的,它只有在運行時可以找到可能涉及app.config探測提示的程序集時纔有效。 – Josh 2010-10-24 19:15:46

6

如果可以使用Assembly.LoadFrom,那麼你可以通過執行獲得類型得到大會:

 Assembly assembly = Assembly.LoadFrom("whatever"); 
     Type myType = assembly.GetType("typeName") 

組裝.GetType有其他過載,你可以找到關於here

+2

+1務實的解決方案。不過,如果其他代碼嘗試通過加載上下文在AssemblyResolve中加載同一程序集中的其他類型,他仍然可能遇到問題。不幸的是,LoadFrom只是有一堆意想不到的副作用,很難解決。 – Josh 2010-10-24 17:30:07

相關問題