2010-08-05 190 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