35

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

4

1 回答 1

66

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

AppDomain.GetAssemblies()为您提供所有已加载到当前 AppDomain 中的程序集。 BuildManager.GetReferencedAssemblies()(此方法仅在.Net Framework System.Web.dll中可用)返回从 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 中。

当然,这都需要进行某些优化等,但总体思路是成立的。

于 2010-03-19T17:43:06.467 回答