0

我在我的 dll 文件中弄乱了我的 IL 代码(仅用于学习目的)。我想看看如果我注入自己的 IL 代码会发生什么,例如IL_9999: box !T... 我想知道偏移值是否真的很重要......

就性能而言,9999 的 IL 偏移是否比 1000 的 IL 偏移成本更高?我的猜测是它不会因为编译器本身在按顺序运行时会跳过偏移量:

IL_000d:  ldc.i4.3
IL_000e:  box        [mscorlib]System.Int32
IL_0013:  call       instance int32 [mscorlib]System.Enum::CompareTo(object)
IL_0018:  call       void [mscorlib]System.Console::WriteLine(int32)
IL_001d:  nop

此外,如果将我的 9999 的 IL 偏移量放入这些其他价值低得多的 IL 偏移量调用的中间,是否会损害我的应用程序?

4

1 回答 1

4

所有这些IL_XXXX:实际上都不是偏移量,它们是标签。只是反编译器倾向于为每条指令添加一个标签,并根据其偏移量对其进行命名。这是因为标签名称不会保留在编译后的代码中(例如,编译后的 C# 可能不会有有意义的标签名称,即使它们被保留)并且反编译器需要至少有一些标签才能在分支指令中使用。

因此,如果您修改“偏移量”,然后使用 ilasm 编译代码,您实际上并没有以任何方式更改代码。因此,它不会对性能产生任何影响。

您可以验证这一点的一种方法是再次反编译修改后的程序集。

于 2012-12-01T12:16:03.153 回答