与AppDomain.GetAssemblies()
相比,BuildManager.GetReferencedAssemblies()
(System.Web.Compilation.BuildManager)似乎是一种更可靠的方法来获取ASP.NET应用程序在运行时引用的程序集,因为AppDomain.GetAssemblies()只获得“已将已加载到此应用程序域的执行上下文中的程序集”。
迭代所有程序集是在DI容器中应用程序启动时动态注册类型的重要工具,特别是在应用程序启动期间,可能还没有加载其他程序集(不需要),以及组合root是第一个需要它们的人。因此,有一个可靠的方法来获取应用程序的引用程序集非常重要。
虽然BuildManager.GetReferencedAssemblies()
是ASP.NET应用程序的可靠方法,但我想知道:可用于其他类型应用程序的替代方案,例如桌面应用程序,Windows服务和自我-hosted WCF服务?
答案 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);