通常,在執行引用的程序集中的類型的第一個方法時,會加載程序集的引用程序集。加載引用的.NET程序集時進行控制
在應用程序流可以容忍延遲的點上強制加載所有引用的程序集,以避免在進一步執行時可能無法容忍(例如,在時間關鍵型方法中)時是否有意義?
如果是,那麼最好的方法是什麼? (Reflection,...)
通常,在執行引用的程序集中的類型的第一個方法時,會加載程序集的引用程序集。加載引用的.NET程序集時進行控制
在應用程序流可以容忍延遲的點上強制加載所有引用的程序集,以避免在進一步執行時可能無法容忍(例如,在時間關鍵型方法中)時是否有意義?
如果是,那麼最好的方法是什麼? (Reflection,...)
我目前僱主的產品之一從入口程序集的目錄中獲取所有DLL的列表。然後使用Assembly.LoadFrom
加載它們。它在啓動畫面啓動時執行此操作。坦率地說,代碼讓我害怕。我們必須加入一些黑客來避免某些DLL。在更新之前,我們必須更改安裝程序以清除目標目錄。這是一個非常不安全的計劃。
在上一份工作中,我寫了一個類似的函數,使用了GetReferencedAssemblies
方法。從入口程序集開始,它將遞歸地調用Assembly.LoadFrom
。它加載了一個未隨產品發貨的程序集後會停止遞歸。它的工作,但我後來認爲它是沒有必要的。
在我開發的產品中,我們使用Autofac爲應用程序構建完整的依賴關係樹。引導程序代碼來配置引用整個項目中的所有服務 - 我猜想至少有70%的代碼。再次,這是在啓動畫面啓動時觸發的。這是正確的方法。它平衡了「加載必需品」與「花時間加載所有東西,包括可能永遠不會使用的東西」。
到目前爲止,最好的方法是在時間不關鍵時執行一次。這可以確保在磁盤上找到程序集文件,它的IL已加載並且代碼能夠及時編譯。當心垃圾收集器,它可能會導致暫停,所以編寫方法只使用預先分配的對象。 –
好的,你可以更具體什麼時間不重要時要執行一次嗎? – Harry13
您的「時間關鍵法」。 –