我可以使用反射来检查方法中的代码吗?

kor*_*lan 40 c# reflection

我正在玩C#反射API.我可以轻松地Type在程序集中加载类,方法等信息,但是,现在我想知道如何加载和读取方法中的代码?

Fox*_*ire 35

基本答案:

你不能用反射API(System.Reflection).

原因是反射api被设计用于元数据(类的类型,名称和方法的签名,......),但不在数据级别(这将是IL流本身)上.

扩展答案:

您可以使用System.Reflection.Emit(例如ILGenerator Class)发出(但不读取)IL.

通过MethodInfo.GetMethodBody()您可以获得用于实现方法的二进制IL流.但那通常完全没用.

您可以使用外部库(如Cecil)来读取/修改/添加/删除方法中的代码.


Chr*_*lor 16

这取决于您阅读代码的含义.有4种形式的代码.

1-源代码,例如.原始的C#或VB.NET - 不,你不能用反射得到这个
- 符号IL代码 - 不,你不能用反射得到这个
3- JITed汇编代码 - 不,你不能用反射得到这个

4- IL字节,IL编译到的实际字节,你可以得到.

例如,看一下MethodBase.GetMethodBody(),你可以得到IL字节,局部变量,异常帧等 .http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.getmethodbody的.aspx


Aar*_*ght 9

有点可以.相关函数是MethodBase.GetMethodBody.

它并不是最有用的API.您可以获得有关方法内部内容的一些基本信息,并且可以将IL作为字节数组获取.就是这样.

Mono.Cecil库中有一个稍好的API ,它公开了一个包含实际MethodDefinitionMethodBody实现的类Instructions,因此您不必解释原始字节代码.尽管如此,如果你想从反射器中获取C#代码,你将会非常失望.此外,塞西尔没有很好的记录.

如果你还想尝试,那么祝你好运.