Is there a straighforward library that I can use to access the CIL for a .NET type? Let me demonstrate what I want the fictitious CilExtractor to do:
[Serializable]
public class Type_For_Extract_Cil_Test {
private int _field = 3;
public int Method(int value) {
checked {
return _field + value;
}
}
}
[Test]
public void Extract_Cil_For_Type_Test() {
string actualCil = CilExtractor.ExtractCil(typeof(Type_For_Extract_Cil_Test));
string expectedCil = @"
.class public auto ansi serializable beforefieldinit Type_For_Extract_Cil_Test
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
.maxstack 8
ldarg.0
ldc.i4.3
stfld int32 Type_For_Extract_Cil_Test::_field
ldarg.0
call instance void [mscorlib]System.Object::.ctor()
ret
}
.method public hidebysig instance int32 Method(int32 'value') cil managed
{
.maxstack 8
ldarg.0
ldfld int32 Type_For_Extract_Cil_Test::_field
ldarg.1
add.ovf
ret
}
.field private int32 _field
}";
// indentations and code formatting issues apart, this should succeed
Assert.AreEqual(expectedCil, actualCil);
}
I know I can do this with Mono.Cecil or Reflector, but I also know I have to write a lot of code to achieve this. Since Reflector already does this on its UI, isn't there a simple way to access this functionality, like with a simple method call? Are there other libraries that are better suited to this specific scenario?
Well there is the ildasm.exe tool provided by the .NET framework and it can be used in a command-line environment to do the disassembly, it might be a good place to start.
Here is the MSDN Documentation on the command-line options.
I don't know of a tool for extracting the disassembly in text form, other than ildasm.
I think Mono.Cecil is able to retrieve all the metadata about an assembly and its types, including the CIL code. The assembly is represented by a collection of objects, however, not in textual form.
Probably the built-in Reflection.Emit stuff can extract CIL too, but I'm not sure.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With