AppDomain.GetAssemblies和BuildManager.GetReferencedAssemblies之间的区别

时间:2010-03-19 13:52:28

标签: asp.net-mvc assemblies buildmanager

在完全信任的asp.net mvc 2应用程序的上下文中,只是想知道两者之间是否存在任何差异。

1 个答案:

答案 0 :(得分:56)

.NET Framework将加载程序集推迟到当前的AppDomain中,直到需要它们为止。例如,如果仅从SomeMethod()调用第三方库,则第一方DLL通常在第一次运行SomeMethod()之前不会加载。

AppDomain.GetAssemblies()为您提供已加载到当前AppDomain的所有程序集。 BuildManager.GetReferencedAssemblies()返回从Web.config和其他地方引用的所有程序集的列表,并将这些程序集加载到当前的AppDomain中。

以上是上述例子。

  1. SomeMethod()尚未运行。
  2. 调用AppDomain.GetAssemblies(),返回一个不包含ThirdParty.dll的集。
  3. 调用SomeMethod()。
  4. 调用AppDomain.GetAssemblies(),返回包含ThirdParty.dll的集合。
  5. 在此示例中,CLR将ThirdParty.dll加载到当前AppDomain中,直到绝对必要。因为有必要执行SomeMethod(),所以当它被加载时。

    可替换地:

    1. SomeMethod()尚未运行。
    2. 调用AppDomain.GetAssemblies(),返回一个不包含ThirdParty.dll的集。
    3. 调用BuildManager.GetReferencedAssemblies(),返回包含ThirdParty.dll的集合。
    4. 调用AppDomain.GetAssemblies(),返回包含ThirdParty.dll的集合。
    5. 在这里,即使你从未调用过SomeMethod(),对BuildManager.GetReferencedAssemblies()的调用代表你将第三方库加载到当前的AppDomain中。

      当然,这一切都需要进行某些优化等,但总体思路仍然存在。