簡體   English   中英

.net控制台應用程序生命周期-解決BuildManager.GetReferencedAssemblies中的啟動前初始化錯誤

[英].net console app lifecycle - working around a pre-start initialization error from BuildManager.GetReferencedAssemblies

我試圖遍歷控制台應用程序中引用的程序集。 我在其他項目中一直使用BuildManager.GetReferencedAssemblies進行此操作,但是在我的控制台應用程序中,我收到了InvalidOperationException:無法在應用程序的啟動前初始化階段調用此方法。

據我所知,沒有一種方法可以延遲控制台應用程序中的執行。 您是在靜態void Main中執行此操作,還是根本不執行此操作?有人對如何解決此問題有任何建議嗎?

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()也會這樣做。)

AppDomain.CurrentDomain.GetAssemblies()並不能完全解決問題。 盡管引用了某些程序集,但其中未包含這些程序集。 我所做的是:

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

它沒有返回比AppDomain.CurrentDomain.GetAssemblies()還要多的程序集,但是它返回了我需要的程序集。 不知道為什么會有差異。 腦,謝謝你的答復。 您讓我走上了我所需要的軌道,我贊成您的答復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM