2010-08-05 191 views
1

预启动初始化错误我想通过我的控制台应用程序中引用的程序集迭代。我一直在使用其他项目中的BuildManager.GetReferencedAssemblies执行此操作,但在控制台应用程序中,我得到一个InvalidOperationException:在应用程序的预启动初始化阶段无法调用此方法。.net控制台应用程序生命周期 - 解决从BuildManager.GetReferencedAssemblies

据我所知,没有办法在控制台程序中延迟执行。你在静态无效Main中做,或者你根本就不做......任何人都有如何解决这个问题的建议?

回答

0

AppDomain.CurrentDomain.GetAssemblies()并不完美。有些程序集虽然被引用,但并未包含在内。我所做的是这样的:

allAssemblies = (from name in Assembly.GetEntryAssembly().GetReferencedAssemblies() 
     select Assembly.Load(name)).ToList(); 

这并没有返回尽可能多的组件为AppDomain.CurrentDomain.GetAssemblies(),但它返回我需要的人。不知道为什么有差异。 Cerebrate,谢谢你的回复。你让我走上了我需要的轨道,并且我赞成你的回复。

+0

这不适合我,可能出于同样的原因,这个答案谈到: http://stackoverflow.com/a/2479400/178143 – Ted 2013-11-11 14:36:01

6

System.Web.Compilation命名空间的BuildManager.GetReferencedAssemblies()?

据我所知,这是ASP.NET特定的,这就是为什么它不能在您的控制台应用程序工作。 (或者在Windows应用程序中)。

因此,第一个子问题是您是否需要BuildManager.GetReferencedAssemblies的特殊功能,即它通过探索并发现 - 除了ASP.NET参考组件的具体方式 - 不仅所有的组件,你的应用程序引用,但所有他们引用组件等,等

(见Difference between AppDomain.GetAssemblies and BuildManager.GetReferencedAssemblies

如果你想什么要做的只是一个你的.exe直接引用的程序集列表(加上从那时起被动态加载的任何东西,无论是明确的代码还是隐含的itly通过调用引用的组件本身引用它们),最简单的方法就是这样的:

// Get all currently loaded assemblies. 
var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 

如果不是,那就是它会变得复杂,你,因为没有一个简单的方法。 NET来获取应用程序间接引用的所有程序集列表。理论上,您可以编写代码,以递归方式在Assembly.GetReferencedAssemblies()上调用Assembly.GetReferencedAssemblies(),然后从所有结果中获得这些结果,然后从所有结果中获得 - 丢弃重复项,所以不要最终会陷入无限循环 - 最终会最终得到所有应用程序直接或间接静态引用的程序集。

(如果你曾经引用组件动态,通过AppDomain.Load()或一些这样说,这就不一一列举了。不过,我不相信BuildManager.GetReferencedAssemblies()会那样做。)

+0

有时DLL并没有从开始加载,看到这个答案: http://stackoverflow.com/a/2479400/178143 因此,有时需要类似BuildManager的东西。 – Ted 2013-11-11 14:33:37