2010-04-17 25 views
3

Cecil中有沒有類似Reflection.Emit.DynamicMethod的東西?謝謝。Cecil中的DynamicMethod

  1. DynamicMethod的

編輯:

怎麼樣以下的東西呢?

  • EmitCall(例如
    IL.EmitCall(OpCodes.Callvirt,GetBuildKey,NULL); IL.Emit(OpCodes.Unbox_Any,dependencyType); )
  • LocalBuilder(例如LocalBuilder解決= ilContext.IL.DeclareLocal(typeof運算(布爾));)
  • System.Reflection.Emit.Label(例如標籤existingObjectNotNull = buildContext.IL.DefineLabel())//是否必須使用TextMap?
  • ILGenerator.BeginCatchBlock(例如ilContext.IL.BeginCatchBlock(typeof運算(例外));)
  • ILGenerator.MarkLabel(例如ilContext.IL.MarkLabel(parameterResolveFailed);)
  • ILGenerator.EndExceptionBlock ()(例如ilContext.IL.EndExceptionBlock();)
  • +0

    是塞西爾單庫,對吧?我已經添加了標籤*單聲道* – YOU 2010-04-17 03:08:03

    +0

    是啊是的..謝謝。 – 2010-04-17 03:25:43

    +0

    @邁克爾,你從.Net移動到單聲道還是隻是測試它?哦,順便說一句,我想我們以前都認識對方。 – YOU 2010-04-17 03:35:26

    回答

    5

    沒有辦法用Cecil創建DynamicMethod,也沒有等價的方法。

    DynamicMethod與運行時緊密聯繫,而Cecil完全分離。他們兩個有一個完全獨立的類型系統。 DynamicMethod應該是動態的,因此必須使用System.Reflection類型系統,因爲它是運行時可用的系統。 Mono.Cecil具有適用於靜態分析的此類型系統的另一種表示形式,無需在運行時實際加載程序集。因此,如果您想使用DynamicMethod,則必須將其與其環境一起使用。

    此問題最初是在沒有DynamicMethods或SRE的運行時環境中提出的,比如Compact Framework,其中Cecil可用於在運行時發出代碼。

    當然這是可能的,但你必須支付加載程序集的價格,這對於CF設備來說是不小的價格。這意味着如果你可以用Cecil創建一個只有一個靜態方法的程序集來模擬DynamicMethod,那聽起來很糟糕。這些程序集不可收集(DynamicMethods),使其成爲一個巨大的內存泄漏。

    如果您需要在Compact Framework上運行時發出代碼,請儘可能少地發出代碼,並儘可能少地發出程序集。

    +1

    謝謝,Jb.我很感激。 – 2010-07-07 10:32:17