インスタンスメソッド Object.Equals(Object) を検討しています。リフレクションを使用すると、次のように、このメソッドの IL をバイト配列として取得できます。
var mi = typeof(object).GetMethod("Equals", BindingFlags.Instance | BindingFlags.Public);
var mb = mi.GetMethodBody();
var bytes = mb.GetILAsByteArray();
私は 2 台の PC を持っています。1 台は Windows XP を実行する 32 ビット マシンで、もう 1 台は Windows 7 を実行する 64 ビット マシンです。両方のマシンには、.NET Framework のバージョン 4.0.30319 SP1Rel がインストールされています。
x86 マシンでは、結果の配列は次のようになります。
[0]: 2
[1]: 3
[2]: 40
[3]: 122
[4]: 67
[5]: 0
[6]: 6
[7]: 42
ただし、x64 マシンでは、次のようになります。
[0]: 2
[1]: 3
[2]: 40
[3]: 123
[4]: 67
[5]: 0
[6]: 6
[7]: 42
4 番目のバイトが異なります。
これで、64 ビット プラットフォームでは mscorlib に 2 つの種類があることがわかりました。ただし、ILDASM は、このメソッドの IL がフレーバー間およびマシン間で同一であることを明らかにしています。x64 マシンでは、上記のコードを「任意の CPU」と「x86」の両方でターゲットにしましたが、結果は同じです。
私の質問は、この 2 台のマシンの間で指摘されている不一致を説明できる人はいますか?
アップデート
Object.Equals(Object) の C# と IL は次のとおりです。
public virtual bool Equals(object obj)
{
return RuntimeHelpers.Equals(this, obj);
}
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: call bool System.Runtime.CompilerServices.RuntimeHelpers::Equals(object, object)
IL_0007: ret