给定一个汇编对象,我可以将其反汇编为文本吗?

时间:2015-11-15 03:10:06

标签: c# metadata clr cil

我的情况是我只在内存中引用了托管的Assembly Reference对象,即我没有dll或实际代码。整个问题是关于我有System.Reflection.Assembly的内存表示。

我希望能够将其反汇编为文本,或者至少获取元数据,让我们说一个函数体。

这可能吗?

我已经尝试过对象的所有公共表面区域并没有给出任何结果。

1 个答案:

答案 0 :(得分:1)

我不知道任何会将整个内存中的程序集拆分成文本的内容。而且我不知道如何将内存中的程序集保存到磁盘以使用基于文件的反汇编程序(如ildasm)。

但如果你想要的只是找出方法使用的常量字符串,你就不需要这些了。<​​/ p>

要访问方法的IL(您拥有MethodInfo),可以使用method.GetMethodBody().GetILAsByteArray()。正如方法名称所暗示的那样,这会给你一个byte[],这不容易使用。但是你可以使用Jb Evain的Mono.Reflection为你做艰苦的工作(尽管名称,它与Mono并不真正相关,也可以从普通的.Net中使用)。

剩下的唯一步骤是认识到使用ldstr指令访问常量字符串,以便我们需要查找。

了解所有这些,找到方法使用的常量字符串就像:

method.GetInstructions().Where(i => i.OpCode == OpCodes.Ldstr).Select(i => (string)i.Operand)