当前位置: 首页 > 编程语言 > C#

如何从DynamicMethod获取ILbytearray?Share

时间:2023-04-11 02:55:50 C#

如何从DynamicMethod获取ILbytearray?作为一个新奇事物,我试图了解IL与运行时生成的轻型代码与VS编译器生成的代码有何不同,因为我注意到VS代码往往以不同的性能配置文件运行。所以我写了下面的代码::Funcvs=x=>(string)x;表达式exp=x=>(string)x;varcompiled=exp.Compile();Array.ForEach(vs.Method.GetMethodBody().GetILAsByteArray(),Console.WriteLine);Array.ForEach(compiled.Method.GetMethodBody().GetILAsByteArray(),Console.WriteLine);不幸的是,这会抛出异常,因为GetMethodBody显然是针对表达式树生成的代码的非法操作。如何以库的方式查看使用轻量级codegen生成的代码(即不使用外部工具,除非该工具具有API)?编辑:错误发生在第5行,compile.Method.GetMethodBody()抛出异常。Edit2:有谁知道如何恢复方法中声明的局部变量?或者没有办法获取变量?是的,不起作用,该方法由Reflection.Emit生成。IL存储在MethodBuilder的ILGenerator中。你可以把它挖出来,但你必须非常拼命。需要反思内部和私人成员。这适用于.NET3.5SP1:使用System.Linq.Expressions;使用System.Reflection;使用System.Reflection.Emit;...varmtype=compiled.Method.GetType();varfiOwner=mtype.GetField("m_owner",BindingFlags.Instance|BindingFlags.NonPublic);vardynMethod=fiOwner.GetValue(compiled.Method)asDynamicMethod;varilgen=dynMethod.GetILGenerator();varfiBytes=ilgen.GetType().GetField("m_ILStream",BindingFlags.Instance|BindingFlags.NonPublic);varfiLength=ilgen.GetType().GetField("m_length",BindingFlags.Instance|BindingFlags.NonPublic);byte[]il=fiBytes.GetValue(ilgen)asbyte[];intcnt=(int)fiLength.GetValue(ilgen);//从//...转储字节在.NET4.0上,您必须使用ilgen.GetType()。BaseType.GetField(…)因为IL生成器变了,DynamicILGenerator,派生自ILGenerator。ILReader我听说应该工作。ILVisualizer2010解决方案http://blogs.msdn.com/b/haibo_luo/archive/2010/04/19/9998595.aspx根据HansPassant的工作,我能够更深入地了解您应该使用的方法调用,调用BakeByteArray以便下面的Work::vardynMethod=fiOwner.GetValue(compiled.Method)asDynamicMethod;varilgen=dynamicMethod.GetILGenerator();byte[]il=ilgen.GetType().GetMethod("BakeByteArray",BindingFlags.NonPublic|BindingFlags.Instance).Invoke(ilgen,null)作为字节[];这肯定有帮助,但我仍然无法绕过VariableInfo,这对我的工作有帮助。当前的解决方案不能很好地解决.NET4中的当前情况。您可以使用DynamicILInfo或ILGenerator创建动态方法,但此处列出的解决方案根本不适用于DynamicILInfo动态方法。无论您使用DynamicILInfo方法还是ILGenerator方法生成IL,IL字节码最终都在DynamicMethod.m_resolver.m_code中。您不必检查这两种方法,这是一个不太复杂的解决方案。这是您应该使用的版本:if(resolver==null)thrownewArgumentException("动态方法的IL尚未完成。");return(byte[])resolver.GetType().GetField("m_code",BindingFlags.Instance|BindingFlags.NonPublic).GetValue(解析器);有关DynamicMethod令牌解析问题的更多辅助方法和解决方案,请参阅此答案。以上就是C#学习教程:HowtogetILbytearrayfromDynamicMethod?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: