2012-10-30 31 views
4

通常,在執行引用的程序集中的類型的第一個方法時,會加載程序集的引用程序集。加載引用的.NET程序集時進行控制

在應用程序流可以容忍延遲的點上強制加載所有引用的程序集,以避免在進一步執行時可能無法容忍(例如,在時間關鍵型方法中)時是否有意義?

如果是,那麼最好的方法是什麼? (Reflection,...)

+2

到目前爲止,最好的方法是在時間不關鍵時執行一次。這可以確保在磁盤上找到程序集文件,它的IL已加載並且代碼能夠及時編譯。當心垃圾收集器,它可能會導致暫停,所以編寫方法只使用預先分配的對象。 –

+0

好的,你可以更具體什麼時間不重要時要執行一次嗎? – Harry13

+0

您的「時間關鍵法」。 –

回答

2

我目前僱主的產品之一從入口程序集的目錄中獲取所有DLL的列表。然後使用Assembly.LoadFrom加載它們。它在啓動畫面啓動時執行此操作。坦率地說,代碼讓我害怕。我們必須加入一些黑客來避免某些DLL。在更新之前,我們必須更改安裝程序以清除目標目錄。這是一個非常不安全的計劃。

在上一份工作中,我寫了一個類似的函數,使用了GetReferencedAssemblies方法。從入口程序集開始,它將遞歸地調用Assembly.LoadFrom。它加載了一個未隨產品發貨的程序集後會停止遞歸。它的工作,但我後來認爲它是沒有必要的。

在我開發的產品中,我們使用Autofac爲應用程序構建完整的依賴關係樹。引導程序代碼來配置引用整個項目中的所有服務 - 我猜想至少有70%的代碼。再次,這是在啓動畫面啓動時觸發的。這是正確的方法。它平衡了「加載必需品」與「花時間加載所有東西,包括可能永遠不會使用的東西」。