我可以使用反射来检查的方法的代码?我可以使用反射来检查的方法的代码?(Can I use refle

2019-05-10 10:05发布

我玩弄C#的反射API。 我可以很容易地加载Type的类,方法等信息,集会,不过,现在我不知道如何可以加载和读取方法中的代码?

Answer 1:

基本答案:

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

其原因是,反射API被设计为在元数据工作(类,名称和方法的签名类型,...),但不是在数据级(这将是IL-流本身)。

扩展答案:

您可以发射(但不读)IL与System.Reflection.Emit(如的ILGenerator类)。

通过MethodInfo.GetMethodBody()就可以得到二进制IL-流的方法的实现。 但是那通常是完全无用的本身。

有外部库(如塞西尔 ,你可以用它来读取/修改/添加/删除方法中的代码)。



Answer 2:

这取决于你的意思是通过阅读代码是什么。 有4种形式的代码。

1-源代码例如。 原来的C#或VB.NET - 不,你不能用反射得到这个
2-象征性的IL代码 - 不,你不能用反射得到这个
3- JIT编译的汇编代码 - 不,你不能用反射得到这个

4- IL字节,即IL被编译到实际的字节,这个你可以得到的。

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



Answer 3:

那种可以。 相关的功能是MethodBase.GetMethodBody 。

这不完全是最有用的API。 你可以得到有关该方法的里面是什么的一些基本信息,并可以得到IL作为字节数组。 仅此而已。

有一个在一个稍微好一点的API Mono.Cecil能库,它暴露了MethodDefinition用自己的类MethodBody其中包含实际执行Instructions ,所以你不必解释原始字节码。 不过,如果你正在寻找让C#代码出来的单反射,你会大失所望。 此外,塞西尔是不是非常有据可查。

如果你仍然想尝试,那么好运气。



Answer 4:

如果你不需要做实时,看看反射 。 您可以拆卸任何.NET程序集(包括MS核心的DLL),看看您所选择的语言的代码。 这可以是非常有教育意义。

更新已使用的反射镜反射镜弄清楚如何做到这一点没有人尝试过?



Answer 5:

没有
这是定于C#的下一个版本的特征。 您可以使用的CodeDOM得到比反射更多的信息,但你不能询问解析树呢。

那么总有单声道,单声道编译器是一种服务,你可以在运行时得到解析树。

更好的问题是,为什么你要?



Answer 6:

是的,必须有一种方式来实现这一目标:在.NET反射工具做到这一点,太。 不能告诉你它是如何做在那里,虽然。



文章来源: Can I use reflection to inspect the code in a method?
标签: c# reflection