与非Web应用程序等效的BuildManager.GetReferencedAssemblies

时间:2012-10-08 10:16:45

标签: asp.net asp.net-mvc winforms wcf asp.net-web-api

AppDomain.GetAssemblies()相比,BuildManager.GetReferencedAssemblies()System.Web.Compilation.BuildManager)似乎是一种更可靠的方法来获取ASP.NET应用程序在运行时引用的程序集,因为AppDomain.GetAssemblies()只获得“已将加载到此应用程序域的执行上下文中的程序集”。

迭代所有程序集是在DI容器中应用程序启动时动态注册类型的重要工具,特别是在应用程序启动期间,可能还没有加载其他程序集(不需要),以及组合root是第一个需要它们的人。因此,有一个可靠的方法来获取应用程序的引用程序集非常重要。

虽然BuildManager.GetReferencedAssemblies()是ASP.NET应用程序的可靠方法,但我想知道:可用于其他类型应用程序的替代方案,例如桌面应用程序,Windows服务和自我-hosted WCF服务?

3 个答案:

答案 0 :(得分:11)

我目前看到的唯一方法是手动预取所有引用的程序集,就像BuildManager所做的一样:

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

答案 1 :(得分:2)

我遇到了同样的问题。在做了一些研究之后,我还没有找到一个可靠的答案。我提出的最好的方法是将AppDomain.CurrentDomain.GetAssemblies()AppDomain.AssemblyLoad事件合并。

通过这种方式,我可以处理所有已加载的程序集,同时获得所有新程序集的通知(然后我会扫描)。

答案 2 :(得分:0)

此解决方案基于@ steven的回答。 但是可以在Web,WinForms,控制台和Windows服务中使用。

var binDirectory = String.IsNullOrEmpty(AppDomain.CurrentDomain.RelativeSearchPath) ? AppDomain.CurrentDomain.BaseDirectory : AppDomain.CurrentDomain.RelativeSearchPath;

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