2013-04-15 59 views
1

MSDN明確收集DynamicMethod的

可以使用DynamicMethod的類來生成,並在運行時執行的方法 ,無需生成一個動態組件和 動態類型包含的方法。當回收DynamicMethod對象 時,由即時(JIT)編譯器創建的可執行代碼將被回收。動態方法是生成 並執行少量代碼的最有效方法。

我有以下代碼:

Type returnType = typeof(string); 
Type[] argTypes = { typeof(string), typeof(IEnumerable<string>) }; 

var dynamicMethod = new DynamicMethod("DynamicMethod1", returnType, argTypes); 
ILGenerator ilGen = dynamicMethod.GetILGenerator(); 
const string Returned = "returned"; 
ilGen.Emit(OpCodes.Ldstr, Returned); 
ilGen.Emit(OpCodes.Ret); 

var handler = 
    (Func<string, IEnumerable<string>, string>) 
    dynamicMethod.CreateDelegate(typeof(Func<string, IEnumerable<string>, string>)); 

即我創建動態方法有一些簡單的身體,那麼我想委託保存到靜態屬性。幾次調用這個委託後,我想回收/收集方法,並用另一個機構重新創建它(我編寫了解釋性語言,將我的自定義語法解釋爲MSIL字節碼 - 類似於編譯器),並將新委託保存到靜態屬性中。

我如何明確收集/回收動態方法?

+3

相同的方式,在C#中的任何對象。不要引用它並允許它被收集。 –

+0

如果我只是刪除所有我對動態方法的引用,我不知道GC從內存中刪除此方法的時刻,我不知道何時可以使用相同名稱創建新方法(「DynamicMethod1」)。 –

+2

但是,當然,您傳遞的名稱與範圍目的完全無關。如果不是,如果其他API試圖創建一個同名的方法會發生什麼?只要刪除所有引用,允許在將來一段時間收集它,並隨時創建替代實現。重要的是「DynamicMethod」實例的句柄,而不是其(任意)名稱。 –

回答

0

您不能顯式拋棄DynamicMethod,因爲它沒有實現IDisposable接口。但是你可以告訴GarbageCollector當你想它來收集:System.GC.Collect();

這種「強制各代的即時垃圾回收」根據MSDN

+0

請注意,不鼓勵顯式調用'GC.Collect()' – TiMoch

+0

如果你想強制收集,這是要走的路,對嗎? – Mzn

+0

是的。但是,完整的集合將會停止執行的所有線程。經驗法則是相信GC在需要時收集。動態方法通常是輕量級的,它們施加的內存壓力太低以至於它們的收集不應該成爲問題。這有點像真正的垃圾收集,你不要求在全市範圍內收集垃圾,因爲你只是在你家門前放一個袋子。你所做的是等到每週定期進行垃圾收集。 – TiMoch