我正在尝试迭代控制台应用程序中引用的程序集。我一直在其他项目中使用 BuildManager.GetReferencedAssemblies 执行此操作,但在我的控制台应用程序中,我收到 InvalidOperationException: 在应用程序的预启动初始化阶段无法调用此方法。
据我所知,没有办法在控制台应用程序中延迟执行。您在 static void Main 中执行此操作,或者根本不执行此操作...有人对如何解决此问题有任何建议吗?
来自 System.Web.Compilation 命名空间的 BuildManager.GetReferencedAssemblies() ?
据我所知,这是 ASP.NET 特有的,这就是它无法在您的控制台应用程序中工作的原因。 (或者在 Windows 应用程序中,就此而言。)
因此,第一个子问题是您是否需要 BuildManager.GetReferencedAssemblies 的特殊功能,即,除了引用程序集的 ASP.NET 特定方式之外,它还需要仔细查找并查找您的应用程序所引用的所有程序集。引用,但它们引用的所有程序集等等。
(See AppDomain.GetAssemblies 和 BuildManager.GetReferencedAssemblies 之间的区别 )
如果您尝试执行的操作只需使用 .exe 直接引用的程序集列表即可正常工作(加上此后动态加载的任何程序集,无论是通过代码显式加载还是通过调用本身引用的引用程序集隐式加载)他们),最简单的方法就是这样:
// Get all currently loaded assemblies.
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
如果不是,那么事情就会变得复杂,因为 .NET 中没有一种简单的方法来获取应用程序间接引用的所有程序集的列表。理论上,您可以编写代码在 Assembly.GetEntryAssembly() 上递归调用 Assembly.GetReferencedAssemblies(),然后调用从中获得的所有结果,然后调用从中获得的所有结果 - 丢弃重复项,这样就不会不会陷入无限循环 - 最终您将得到应用程序直接或间接静态引用的所有程序集。
(如果您曾经动态引用程序集,例如通过 AppDomain.Load() 或类似的方法,它不会列出它们。但是,我也不相信 BuildManager.GetReferencedAssemblies() 会这样做。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)