2011-06-14 291 views
5

我已經繼承了使用DynamicMethod在運行時生成方法的代碼。我也需要修改一些正在生成的代碼。將DynamicMethod保存到磁盤

由於我在MSIL一個的n00b,我希望能夠在反射器上裝入生成的代碼,並確保代碼做什麼,我祈禱它;)

只是,我不能瞭解如何序列化「匿名託管的DynamicMethods程序集」到磁盤。這可能嗎?如果是這樣,怎麼樣?

回答

2

我認爲如果你想在Reflector或dotPeek中加載方法,你需要創建一個實際的程序集。爲此,use MethodBuilder而不是DynamicMethod。他們大多數的用法應該是一樣的。

+0

對不起,讓這個開放了這麼久。我想等到我能夠在接受之前實現這一點,但我當然正在開展另一個項目!儘管如此,這似乎是唯一真正的答案,所以當我重新開始工作時,我會知道該怎麼做。 – 2011-06-16 13:19:15

6

試試這個,

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");