我在考虑实例方法Object.Equals(Object)。使用反射,它是更多钞票,以获得IL此方法作为一个字节数组,如下:为什么MethodBody.GetILAsByteArray在不同的平台上返回不同的数组?
var mi = typeof(object).GetMethod("Equals", BindingFlags.Instance | BindingFlags.Public);
var mb = mi.GetMethodBody();
var bytes = mb.GetILAsByteArray();
我有两个电脑:一个是运行Windows XP的32位机,另一种是64位的与Windows 7.这两台机器都安装了.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”上定位了上述代码,但结果相同。
所以我的问题是,任何人都可以解释两台机器之间的差异吗?
UPDATE
这里的C#和IL为的Object.Equals(对象):
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
也许你也可以向我们展示IL,所以我们可能有一些线索叫什么方法。前三个字节是'ldarg.0''ldarg.1'和'call'。从第四个字节开始的值是目标。 – 2013-02-19 12:34:46
我已经这样做了。请参阅更新。 – 2013-02-19 12:51:43