2017-06-19 78 views
1

對於性能優化,我使用以下代碼動態地創建每個用戶請求新類型:如何卸載使用RunAndCollect創建的動態程序集?

var dynamicAssemblyName = new AssemblyName(assemblyName); 
AssemblyBuilder dynamicAssembly = AssemblyBuilder.DefineDynamicAssembly(dynamicAssemblyName, AssemblyBuilderAccess.RunAndCollect); 
ModuleBuilder moduleBuilder = dynamicAssembly.DefineDynamicModule(assemblyName); 

然後,我使用moduleBuilder發射類型。

這會爲每個請求創建一個新的動態裝配。所以我可能會在應用程序的整個生命週期中遇到很多這樣的問題。所以,我擔心資源將被釋放。因此,我使用AssemblyBuilderAccess.RunAndCollect來實現這一點。 msdn說:

動態程序集可以被卸載並回收它的內存,但要遵守在用於動態類型生成的回收程序集中描述的限制。

我只是沒有發現如何卸載動力總成,不幸的是鏈接到珍藏大會動態類型生成的主題是壞了。

一個不再維護的version of that page似乎表明,一旦發射的類型超出範圍,卸載自動發生。我可以相信嗎?

回答

2

該頁面的不再維護版本似乎表明卸載發生在發射類型超出範圍後自動發生。我可以相信嗎?

是的。該選項稱爲RunAndCollect,因爲當垃圾回收器決定不再需要這些程序集時,這些程序集會自動卸載。沒有API強制卸載收集組件(除觸發GC外)。

您可以通過使用AppDomain.CurrentDomain.GetAssemblies()檢查當前加載的程序集,然後調用GC.Collect()觸發垃圾回收,然後再次檢查加載的程序集來驗證此情況。