我在考慮實例方法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