我玩弄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反射工具做到这一点,太。 不能告诉你它是如何做在那里,虽然。