可以使用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字節碼 - 類似於編譯器),並將新委託保存到靜態屬性中。
我如何明確收集/回收動態方法?
相同的方式,在C#中的任何對象。不要引用它並允許它被收集。 –
如果我只是刪除所有我對動態方法的引用,我不知道GC從內存中刪除此方法的時刻,我不知道何時可以使用相同名稱創建新方法(「DynamicMethod1」)。 –
但是,當然,您傳遞的名稱與範圍目的完全無關。如果不是,如果其他API試圖創建一個同名的方法會發生什麼?只要刪除所有引用,允許在將來一段時間收集它,並隨時創建替代實現。重要的是「DynamicMethod」實例的句柄,而不是其(任意)名稱。 –