Can I use reflection to inspect the code in a meth

2019-01-01 07:14发布

I'm playing around with the C# reflection API. I can easily load Type information of classes, methods etc. in an assembly, however, now I wonder how can I load and read the code inside a method?

标签: c# reflection
7条回答
妖精总统
2楼-- · 2019-01-01 07:51

That depends on what you mean by read the code. There are 4 forms of the code.

1- The source code eg. the original C# or VB.NET - No you cannot get this with reflection
2- The symbolic IL code - No you cannot get this with reflection
3- The JITed assembly code - No you cannot get this with reflection

4- The IL bytes, the actual bytes that IL is compiled to, this you can get.

Take a look at MethodBase.GetMethodBody() for example, you can get the IL bytes, the local variables, exception frames etc. http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.getmethodbody.aspx

查看更多
妖精总统
3楼-- · 2019-01-01 07:58

No
This is a feature slated for the next version of C#. You can use the CodeDom to get more info than reflection, but you cannot interrogate the parse tree yet.

Well there is always mono, in mono the compiler is a service, and you could get the parse trees at runtime.

The better question is why you want to?

查看更多
何处买醉
4楼-- · 2019-01-01 07:59

If you don't need to do this real-time, have a look at Reflector. You can disassemble any .NET assembly (including the MS core DLLs) and see the code in your language of choice. This can be very educational.

Update Has anyone tried using Reflector on Reflector to figure out how this is done?

查看更多
有味是清欢
5楼-- · 2019-01-01 08:07

Basic Answer:

You can't with the reflection API (System.Reflection).

The reason is that the reflection api is designed to work on Metadata (Type of Classes, Name and Signature of Methods, ...) but not on the data level (which would be the IL-stream itself).

Extended Answer:

You can emit (but not read) IL with System.Reflection.Emit (e.g. ILGenerator Class).

Through MethodInfo.GetMethodBody() you can get the binary IL-stream for the implementation of a method. But thats usually completely useless by itself.

There are external libraries (like Cecil) that you can use to read/modify/add/delete code inside a method.

查看更多
梦该遗忘
6楼-- · 2019-01-01 08:09

You sort of can. The relevant function is MethodBase.GetMethodBody.

It's not exactly the most useful API. You can get some basic information about what's inside the method, and you can obtain the IL as a byte array. That's about it.

There's a slightly better API in the Mono.Cecil library, which exposes a MethodDefinition class with its own MethodBody implementation which contains actual Instructions, so you don't have to interpret the raw byte code. Still, if you're looking to get C# code out of it à la Reflector, you're going to be sorely disappointed. Also, Cecil isn't very well documented.

If you still want to try, then good luck.

查看更多
梦醉为红颜
7楼-- · 2019-01-01 08:11

Yes, there must be a way to achieve this: The .NET Reflector tool does this, too. Can't tell you how it's done there, though.

查看更多
登录 后发表回答