我可以使用reflection来检查方法中的代码吗?
我正在玩C#reflectionAPI。 我可以很容易地在一个程序集中加载类,方法等Type
信息,但是,现在我想知道如何加载和读取方法中的代码?
基本答案:
你不能使用reflectionAPI(System.Reflection)。
原因是reflectionapi被devise用于处理元数据(类的types,名称和方法的签名,…),而不是数据级别(这将是ILstream本身)。
扩展答案:
你可以用System.Reflection.Emit(例如ILGenerator Class)发出(但不能读取)IL。
通过MethodInfo.GetMethodBody()
你可以得到二进制的ILstream来实现一个方法。 但是这通常是完全无用的。
有外部库(如塞西尔 ),您可以用来读取/修改/添加/删除方法内的代码。
这取决于你读的代码是什么意思。 有4种forms的代码。
1-源代码例如 原来的C#或VB.NET – 不,你不能得到这个反思
2-符号IL代码 – 不,你不能得到这个反思
3 JIT的汇编代码 – 不,你不能用reflection得到这个
4 IL字节,IL编译到的实际字节,你可以得到。
看看MethodBase.GetMethodBody()例如,你可以得到IL字节,局部variables,exception帧等。http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.getmethodbody的;.aspx
现在有库/包,允许您检查方法代码,甚至反编译为Expression
:
你可以。 相关函数是MethodBase.GetMethodBody 。
这不完全是最有用的API。 你可以得到一些有关方法内部的基本信息,你可以获得IL作为一个字节数组。 就是这样。
在Mono.Cecil库中有一个稍微好一点的API,它公开了一个MethodDefinition
类,它有自己的MethodBody
实现,它包含了实际的Instructions
,所以你不必解释原始字节码。 不过,如果您希望从Reflector中获取C#代码,那么您将非常失望。 另外,塞西尔没有很好的文件。
如果你仍然想尝试,那么祝你好运。
如果您不需要实时进行此操作,请查看Reflector 。 您可以反汇编任何.NET程序集(包括MS核心DLL),并以您select的语言查看代码。 这可能是非常教育的。
更新有没有人尝试在reflection器上使用reflection器来弄清楚这是如何完成的?
没有
这是C#的下一版本的一个function。 你可以使用CodeDom获取更多的信息,而不是reflection,但是你不能询问分析树。
那么总是有单声道,单声道编译器是一个服务,你可以在运行时得到parsing树。
更好的问题是为什么你想要?
是的,必须有一种方法来实现这一点:.NETreflection器工具也这样做。 但是,不能告诉你它是如何完成的。