gpt4 book ai didi

c# - 如何使用 Mono.Cecil 从字节数组中解析 IL 指令

转载 作者:行者123 更新时间:2023-12-03 21:40:36 24 4
gpt4 key购买 nike

我正在使用 CodeDOM 动态编译源代码,
现在我想使用 Cecil 处理生成的特定方法的 IL 代码,CodeDOM 为我提供了该方法的 IL 代码作为字节数组,有没有办法创建 MethodBody,(或只是 Mono.Cecil 的数组) .Cil.Instruction) 从该字节码而不保存程序集并从那里开始?

最佳答案

Cecil 中有解析二进制 IL 的功能。它在类(class) CodeReader Mono.Cecil.Cil命名空间。
方法 ReadCode 或多或少做你想要的。但是该类的设置方式使您不能只传递 byte[] .通常,您需要解析元数据 token ,例如对于方法调用。 CodeReader需要 MetadataReader通过构造函数来做到这一点和MetadataReader反过来需要一个 ModuleDefinition .

如果您不使用 Cecil,还有另一种选择。使用 SDILReader :

// get the method that you want to extract the IL from
MethodInfo methodInfo = typeof(Foo).GetMethod("Bar", BindingFlags.Static | BindingFlags.NonPublic);

Globals.LoadOpCodes();

// doesn't work on DynamicMethod
MethodBodyReader reader = new MethodBodyReader(methodInfo);
List<ILInstruction> instructions = reader.instructions;
string code = reader.GetBodyCode();

另一种选择是 ILReader来自 ILVisualizer 2010 Solution .
DynamicMethod dynamicMethod = new DynamicMethod("HelloWorld", typeof(void), new Type[] { }, typeof(Program), false);

ILGenerator ilGenerator = dynamicMethod.GetILGenerator();
ilGenerator.Emit(OpCodes.Ldstr, "hello, world");
ilGenerator.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
ilGenerator.Emit(OpCodes.Ret);

MethodBodyInfo methodBodyInfo = MethodBodyInfo.Create(dynamicMethod);
string ilCode = string.Join(Environment.NewLine, methodBodyInfo.Instructions);

// get the method that you want to extract the IL from
MethodInfo methodInfo = typeof(Foo).GetMethod("Bar", BindingFlags.Static | BindingFlags.NonPublic);
MethodBodyInfo methodBodyInfo2 = MethodBodyInfo.Create(methodInfo);
string ilCode2 = string.Join(Environment.NewLine, methodBodyInfo2.Instructions);

关于c# - 如何使用 Mono.Cecil 从字节数组中解析 IL 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16191369/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com