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

Her*_*man 32 asp.net-mvc assemblies buildmanager

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

Lev*_*evi 58

.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的集合.

在此示例中,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中.

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

  • @Levi,可能是因为他想要获取所有引用的程序集,而BuildManager有一个获取所有引用程序集的方法. (6认同)
  • 值得注意的是,这个答案已经有 11 年历史了,并且“BuildManager.GetReferencedAssemblies()”在 .Net Core 或 .Net 5.0 中根本不存在。 (5认同)
  • 那么获取 BuildManager 的唯一方法是引用 System.Web.dll?听起来有点奇怪。 (2认同)
  • 是的,如果它不是 ASP.NET 项目,则引用 System.Web.dll 并使用 BuildManager 将引发异常。在 WinForms 中,您不能这样做。 (2认同)
  • 为什么要/需要在 ASP.NET 之外引用 BuildManager?BuildManager 专门设计用于与 ASP.NET 编译系统交互,因此从 WinForms 应用程序引用此类型没有意义。考虑用您要解决的确切问题打开一个新的 SO 问题,因为很可能有一种受支持的方法可以完成您想要的任务。 (2认同)