我如何将 C# 代码编译为 IL 代码指令
how do i compile c# code to IL code instructions
我正在制作一个用修改后的 IL 代码重新编译可执行文件的东西,需要获取 OPcode 指令(没有 类,方法等只是指令)
这样我就可以在方法中add/replace它然后重新编译它。
有什么方法可以编译这个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:
- Select "C# Statements"
- 输入您的代码
- 可选:按window右下角的按钮,选择是否要查看优化的IL
- 按 F5 或绿色执行按钮
- Select 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 直接编译的代码,因为它没有使用类型和成员的完整语法,也因为它没有声明局部变量。
我正在制作一个用修改后的 IL 代码重新编译可执行文件的东西,需要获取 OPcode 指令(没有 类,方法等只是指令) 这样我就可以在方法中add/replace它然后重新编译它。
有什么方法可以编译这个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:
- Select "C# Statements"
- 输入您的代码
- 可选:按window右下角的按钮,选择是否要查看优化的IL
- 按 F5 或绿色执行按钮
- Select 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 直接编译的代码,因为它没有使用类型和成员的完整语法,也因为它没有声明局部变量。