2010-03-19 37 views

回答

51

.NET Framework將裝配加載到當前AppDomain中,直到需要它們。例如,如果僅從SomeMethod()調用第三方庫,則通常不會在第一次運行SomeMethod()時加載第三方DLL。

AppDomain.GetAssemblies()爲您提供了已經加載到當前AppDomain中的所有程序集。 BuildManager.GetReferencedAssemblies()返回從Web.config和別處引用的所有程序集的列表,並將這些程序集加載到當前AppDomain中。

這是上面的一個解決的例子。

  1. SomeMethod()尚未運行。
  2. 調用AppDomain.GetAssemblies(),返回一個不包含ThirdParty.dll的集合。
  3. 調用SomeMethod()。
  4. 調用AppDomain.GetAssemblies(),返回一個包含ThirdParty.dll的集合。

在這個例子中,CLR延遲加載ThirdParty.dll到當前的AppDomain中,直到它是絕對必要的。並且由於它需要執行SomeMethod(),那就是它被加載的時候。

或者:

  1. 的someMethod()尚未運行。
  2. 調用AppDomain.GetAssemblies(),返回一個不包含ThirdParty.dll的集合。
  3. 調用BuildManager.GetReferencedAssemblies(),返回一個包含ThirdParty.dll的集合。
  4. 調用AppDomain.GetAssemblies(),返回一個包含ThirdParty.dll的集合。

在這裏,即使您從未調用過SomeMethod(),代表您調用了BuildManager.GetReferencedAssemblies()將第三方庫加載到當前的AppDomain中。

當然,這都受到某些優化等,但一般的想法成立。

+1

所以獲取BuildManager的唯一方法是引用System.Web.dll?聽起來有點奇怪。 – Ted

+0

@Ted這是怎麼回事?我在上面的回答中簡化了一些,但BuildManager的概念只有在ASP.NET應用程序中才有意義。 – Levi

+1

是的,引用System.Web.dll並使用BuildManager將拋出一個異常,如果它不是一個ASP.NET項目。在WinForms中,你無法做到這一點。 – Ted