【问题标题】:Saving a DynamicMethod to disk将 DynamicMethod 保存到磁盘
【发布时间】:2011-06-14 19:59:12
【问题描述】:

我继承了使用 DynamicMethod 在运行时生成方法的代码。我还需要修改一些正在生成的代码。

由于我是 MSIL 的一名 n00b,我希望能够将生成的代码加载到 Reflector 中,并确保代码能够按照我的意愿执行 ;)

只是,我不知道如何将“匿名托管的 DynamicMethods 程序集”序列化到磁盘。这可能吗?如果有,怎么做?

【问题讨论】:

    标签: .net cil dynamicmethod


    【解决方案1】:

    试试这个,

      var assemblyName = new AssemblyName("SomeName");
      var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave, @"c:");
      var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, assemblyName.Name +  ".dll");
    
      TypeBuilder builder = moduleBuilder.DefineType("Test", TypeAttributes.Public);
      var methodBuilder = builder.DefineMethod("DynamicCreate", MethodAttributes.Public, typeof(T), new[] { typeof(IDataRecord) }); 
      /* this line is a replacement for your  new DynamicMethod(....)  line of code
    
      /* GENERATE YOUR IL CODE HERE */
    
      var t = builder.CreateType();
      assemblyBuilder.Save(assemblyName.Name + ".dll");
    

    【讨论】:

      【解决方案2】:

      我认为如果要在 Reflector 或 dotPeek 中加载方法,则需要创建一个实际的程序集。为此,use MethodBuilder 而不是 DynamicMethod。它们的大部分用法应该是一样的。

      【讨论】:

      • 很抱歉让这个网站开放这么久。在我接受之前,我想等到我可以实现这个,但当然我现在正在做另一个项目!尽管如此,这似乎是唯一真正的答案,所以当我重新开始工作时,我会知道该怎么做。
      猜你喜欢
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 2011-04-14
      • 1970-01-01
      • 2016-07-22
      • 2013-12-19
      • 2010-09-23
      相关资源
      最近更新 更多