2

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

据我所知,没有办法在控制台应用程序中延迟执行。您在 static void Main 中执行此操作,或者您根本不执行此操作...有人对如何解决此问题有任何建议吗?

4

2 回答 2

6

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

据我所知,这是特定于 ASP.NET 的,这就是它在您的控制台应用程序中不起作用的原因。(或者在 Windows 应用程序中,就此而言。)

因此,第一个子问题是您是否需要 BuildManager.GetReferencedAssemblies 的特殊功能,也就是说,除了 ASP.NET 引用程序集的特定方式之外,它还发现并发现不仅是您的应用程序的所有程序集引用,但它们引用的所有程序集等等等等。

(请参阅AppDomain.GetAssemblies 和 BuildManager.GetReferencedAssemblies 之间的区别

如果您尝试执行的操作仅使用您的 .exe 直接引用的程序集列表(以及从那时起动态加载的任何程序集,无论是由您的代码显式加载还是通过调用本身引用的引用程序集隐式调用)都可以正常工作他们),最简单的方法就是:

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

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

(如果您曾经动态地引用程序集,例如通过 AppDomain.Load() 或类似的方式,它不会列出它们。但是,我不相信 BuildManager.GetReferencedAssemblies() 也会这样做。)

于 2010-08-05T22:50:28.073 回答
1

AppDomain.CurrentDomain.GetAssemblies() 并没有完全做到这一点。有一些程序集没有包​​括在内,尽管它们被引用了。我所做的是这样的:

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

这没有返回与 AppDomain.CurrentDomain.GetAssemblies() 一样多的程序集,但它返回了我需要的程序集。不知道为什么会出现差异。Cerebrate,谢谢你的回复。你让我走上了我需要的轨道,我赞成你的回复。

于 2010-08-12T16:05:04.367 回答