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 を使用してコードをコンパイルしても、実際にはコードを変更することはありません。そのため、パフォーマンスに影響を与えることはできません。

これを確認する方法の 1 つは、変更したアセンブリを再度逆コンパイルすることです。

于 2012-12-01T12:16:03.153 に答える