Can I use reflection to inspect the code in a method?
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?
Solution 1:
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.
Solution 2:
That depends on what you mean by "read the code." There are 4 forms of the code.
Code Type | Can get with Reflection
|
---|---|
The source code, i.e. the original C# or VB.NET | No |
The symbolic IL code | No |
The JITed assembly code | No |
The IL bytes, i.e. the actual bytes that IL is compiled to | Yes |
Take a look at MethodBase.GetMethodBody()
for the last one. You can get the IL bytes, the local variables, exception frames etc.