Jef*_*f D 1 .net console-application buildmanager
我正在尝试在我的控制台应用程序中遍历引用的程序集.我已与其他项目BuildManager.GetReferencedAssemblies这样做,但在我的控制台应用程序,我得到一个InvalidOperationException:此方法不能在应用程序的预启动初始化阶段被调用.
据我所知,没有办法在控制台应用程序中延迟执行.你是在static void Main中做的,或者你根本不这样做......任何人对如何解决这个问题都有任何建议吗?
System.Web.Compilation命名空间中的BuildManager.GetReferencedAssemblies()?
据我所知,这是ASP.NET特定的,这就是为什么它不能在您的控制台应用程序中工作.(或者在Windows应用程序中,就此而言.)
所以,第一个子问题是,你是否不需要BuildManager.GetReferencedAssemblies的特殊功能,即它grovels通过并发现 - 除了ASP.NET引用组件的具体方式 - 不仅所有的组件,你的应用程序引用,但它们引用的所有程序集等等.
(请参阅AppDomain.GetAssemblies和BuildManager.GetReferencedAssemblies之间的区别)
如果你想要做的只是你的.exe直接引用的程序集列表(以及从那时起动态加载的任何程序集),或者通过你的代码显式地或通过调用自己引用的引用程序集隐式地工作他们),最简单的方法就是:
// Get all currently loaded assemblies.
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
Run Code Online (Sandbox Code Playgroud)
如果没有,那就是让你变得复杂的地方,因为在.NET中没有一种简单的方法来获取应用程序间接引用的所有程序集的列表.从理论上讲,你可以编写代码来递归调用Assembly.GetEntryAssembly()上的Assembly.GetReferencedAssemblies(),然后调用你从中获得的所有结果,然后是你从那些结果中得到的所有结果 - 丢弃重复项,这样你就可以了最终会陷入无限循环 - 你最终会得到应用程序直接或间接静态引用的所有程序集.
(如果您动态引用程序集,比如AppDomain.Load()或其他类似的程序,它将不会列出它们.但是,我不相信BuildManager.GetReferencedAssemblies()也可以.)