2010-12-21 56 views
3

在插件系統中,我實例化對象並根據某些具有某種標識符(僅爲字符串)的傳入請求調用這些對象的方法。在配置的幫助下,該標識符確定要裝入哪個程序集,此程序集中要實例化哪個類以及要調用哪個方法。程序集加載到一個單獨的AppDomain中。這發生在該像這樣創建一個代理類:維護對Assembly對象的引用以避免不必要的Assembly.LoadFrom調用是好的還是壞主意?

secondDomain.CreateInstanceFromAndUnwrap(Assembly.GetExecutingAssembly().CodeBase, 
    typeof(SecondDomainProxy).FullName) as SecondDamainProxy; 

在課堂上SecondDomainProxy我打開這與上述identifier大會:

string assemblyFileName = GetAssemblyFileNameFromConfig(identifier); 
Assembly assembly = Assembly.LoadFrom(assemblyFileName); 
// Instantiate and run something in assembly 

問:這是否有意義程序集加載完成後,請保持對該Assembly對象的引用?例如用字典...

Dictionary<string, Assembly> _assemblyDict; 

...並通過改變上面的代碼:

​​

我知道大會永遠Assembly.LoadFrom的第一個電話後裝直到AppDomain被卸載。 (第二個AppDomain的壽命與我的情況一樣長。)那麼這是否意味着對Assembly.LoadFrom的第二次調用是便宜的,就像字典查找一樣便宜或幾乎一樣便宜?還是它有缺點不調用assembly.LoadFrom並使用保存的引用呢?

(我的感覺是,它並沒有真正的問題,除非我有我沒有很高的性能要求(每15秒大約一個請求),但我可能是錯的。)

謝謝你提前反饋!

編輯:

Assembly是一個 「正常」 的.NET類。如果我沒有任何對這個類的實例的引用,我認爲它會被垃圾收集。但是組件本身仍然保持加載狀態。因此Assembly.LoadFrom至少需要創建一個Assembly類的新實例,儘管第二次創建該實例可能基於已加載的程序集。

我想補充一個問題:是否爲給定裝配創建裝配對象需要一些沉重的反射,因此總是很昂貴,無論裝配是否加載?

+1

CLR已經這樣做了。 – 2010-12-21 21:23:21

回答

相關問題