14

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

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

虽然BuildManager.GetReferencedAssemblies()对于 ASP.NET 应用程序来说是一种可靠的方法,但我想知道:对于其他类型的应用程序,例如桌面应用程序、Windows 服务和自托管 WCF 服务,还有哪些替代方案可用?

4

3 回答 3

12

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

var assemblies =
    from file in Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory)
    where Path.GetExtension(file) == ".dll"
    select Assembly.LoadFrom(file);
于 2012-10-08T12:11:09.773 回答
2

我有同样的问题。在做了一些研究之后,我仍然没有找到一个可靠的答案。我想出的最好的方法就是AppDomain.CurrentDomain.GetAssemblies()AppDomain.AssemblyLoad事件相结合。

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

于 2012-10-08T11:41:15.063 回答
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);
于 2018-06-01T21:27:43.747 回答