.net控制台应用程序生命周期 - 解决BuildManager.GetReferencedAssemblies中的启动前初始化错误

时间:2010-08-05 21:53:40

标签: .net console-application buildmanager

我正在尝试在控制台应用中迭代引用的程序集。我在其他项目中使用BuildManager.GetReferencedAssemblies进行此操作,但在我的控制台应用程序中,我得到一个InvalidOperationException:在应用程序的预启动初始化阶段,无法调用此方法。

据我所知,没有办法在控制台应用程序中延迟执行。你是在static void Main中做的,或者你根本就不这样做......任何人对如何解决这个问题都有任何建议吗?

2 个答案:

答案 0 :(得分:6)

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

据我所知,这是ASP.NET特有的,这就是为什么它无法在你的控制台应用程序中运行。 (或者在Windows应用程序中,就此而言。)

所以,第一个子问题是你是否需要BuildManager.GetReferencedAssemblies的特殊功能,即除了ASP.NET特定的引用程序集的方法之外,它还要浏览并查找 - 不仅仅是所有的程序集您的应用程序引用了它,但它们引用的所有程序集等等。

(见Difference between AppDomain.GetAssemblies and BuildManager.GetReferencedAssemblies

如果您尝试做的事情只能使用.exe直接引用的程序集列表(以及从那时起动态加载的任何程序集),可以通过代码显式地或通过调用引用的程序集隐式引用它本身就引用了它们,最简单的方法就是:

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

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

(如果你曾经动态地引用过程序集,比如AppDomain.Load()或者其他类似的东西,它就不会列出它们。但是,我不相信BuildManager.GetReferencedAssemblies()也可以。)

答案 1 :(得分:0)

AppDomain.CurrentDomain.GetAssemblies()并没有完全解决问题。虽然引用了一些程序集,但仍有一些程序集未被包含在内。我做的是这个:

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

这并没有返回与AppDomain.CurrentDomain.GetAssemblies()一样多的程序集,但它返回了我需要的程序集。不确定为什么会出现差异。脑虫,谢谢你的答复。你让我在我需要的赛道上,并且我赞成你的回复。