Asp.net

BuildManager.GetReferencedAssemblies 等效於非 Web 應用程序

  • June 1, 2018

與 相比AppDomain.GetAssemblies()BuildManager.GetReferencedAssemblies()( System.Web.Compilation.BuildManager ) 似乎是一種更可靠的方式來獲取 ASP.NET 應用程序在執行時引用的程序集,因為AppDomain.GetAssemblies()只獲取“已經載入到的程序集”此應用程序域的執行上下文”。

遍歷所有程序集是在應用程序啟動時在 DI 容器中動態註冊類型的重要工具,尤其是在應用程序啟動期間,可能還沒有載入其他程序集(在不需要的地方),組合根是第一個需要它們的人。因此,有一個可靠的方法來獲取應用程序的引用程序集是非常重要的。

雖然BuildManager.GetReferencedAssemblies()對於 ASP.NET 應用程序來說是一種可靠的方法,但我想知道:對於其他類型的應用程序,例如桌面應用程序、Windows 服務和自託管 WCF 服務,還有哪些替代方案可用?

我目前看到的唯一方法是手動預取所有引用的程序集,就像幕後BuildManager所做的那樣:

var assemblies =
   from file in Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory)
   where Path.GetExtension(file) == ".dll"
   select Assembly.LoadFrom(file);

我有同樣的問題。在做了一些研究之後,我仍然沒有找到一個可靠的答案。我想出的最好的方法就是AppDomain.CurrentDomain.GetAssemblies()AppDomain.AssemblyLoad事件相結合。

通過這種方式,我可以處理所有已載入的程序集,同時獲得所有新程序集的通知(然後我會對其進行掃描)。

引用自:https://stackoverflow.com/questions/12779665