gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:51:45 25 4
gpt4 key购买 nike

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

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

最佳答案

来自 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.GetReferencedAssembly() on Assembly.GetEntryAssembly(),然后调用从中获得的所有结果,然后再调用从中获得的所有结果 - 丢弃重复项,这样您就不会不要陷入无限循环 - 您最终会得到应用程序直接或间接静态引用的所有程序集。

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

关于.net 控制台应用程序生命周期 - 解决来自 BuildManager.GetReferencedAssemblies 的预启动初始化错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3419510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com