我如何编译C#代码的IL代码指令
问题描述:
林做的是重新编译executeables与modifyed IL代码的事情,需要得到操作码指令(无类,方法等只是说明) ,这样我可以只添加/替换它在方法中,然后重新编译它。我如何编译C#代码的IL代码指令
是有什么方法,我可以编译此C#代码:
int a = 5;
int b = 24;
Console.WriteLine("{0} * {1} = {2}",a,b,a*b);
的IL代码:
.entrypoint
// Code size 38 (0x26)
.maxstack 5
.locals init ([0] int32 a,
[1] int32 b)
IL_0000: nop
IL_0001: ldc.i4.5
IL_0002: stloc.0
IL_0003: ldc.i4.s 24
IL_0005: stloc.1
IL_0006: ldstr "{0} * {1} = {2}"
IL_000b: ldloc.0
IL_000c: box [mscorlib]System.Int32
IL_0011: ldloc.1
IL_0012: box [mscorlib]System.Int32
IL_0017: ldloc.0
IL_0018: ldloc.1
IL_0019: mul
IL_001a: box [mscorlib]System.Int32
IL_001f: call void [mscorlib]System.Console::WriteLine(string,
object,
object,
object)
IL_0024: nop
IL_0025: ret
,这样我可以取代它与ilassem重组呢?
答
如果你正在寻找一个工具,它可以告诉你的IL,您可以使用LINQPad:
- 选择“C#语句”
- 键入代码
- 可选:按下按钮在窗口的右下角,选择是否要看到优化的IL或不
- 按F5 或绿色执行按钮
- 选择IL标签
为您的代码的结果是:
IL_0000: nop
IL_0001: ldc.i4.5
IL_0002: stloc.0 // a
IL_0003: ldc.i4.s 18
IL_0005: stloc.1 // b
IL_0006: ldstr "{0} * {1} = {2}"
IL_000B: ldloc.0 // a
IL_000C: box System.Int32
IL_0011: ldloc.1 // b
IL_0012: box System.Int32
IL_0017: ldloc.0 // a
IL_0018: ldloc.1 // b
IL_0019: mul
IL_001A: box System.Int32
IL_001F: call System.Console.WriteLine
IL_0024: nop
IL_0025: ret
请注意,这不是可以用ILASM直接编译的代码,因为它不使用类型的完整的语法和成员,也因为它不宣布当地人。
如何使用C#编译器,然后反汇编? – thehennyy
你可以编译C#代码,以便它只是内部的函数? – eim64
那么你将有一个包含这种方法的类型。 – thehennyy