我正在考虑实例方法 Object.Equals(Object)。使用反射,可以将此方法的 IL 作为字节数组获取,如下所示:
var mi = typeof(object).GetMethod("Equals", BindingFlags.Instance | BindingFlags.Public);
var mb = mi.GetMethodBody();
var bytes = mb.GetILAsByteArray();
我有两台 PC:一台是运行 Windows XP 的 32 位计算机,另一台是运行 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
第四个字节不同。
现在我知道 mscorlib 在 64 位平台上有两种风格。然而,ILDASM 揭示了这种方法的 IL 在不同口味和机器之间是相同的。在 x64 机器上,我将上述代码定位在“Any CPU”和“x86”,但结果是一样的。
所以我的问题是,任何人都可以解释两台机器之间的显着差异吗?
更新
这是 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