gpt4 book ai didi

.net - 为什么 MethodBody.GetILAsByteArray 在不同的平台上返回不同的数组?

转载 作者:行者123 更新时间:2023-12-04 05:04:12 25 4
gpt4 key购买 nike

我正在考虑实例方法 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 机器上,我将上面的代码定位到“任何 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

最佳答案

通过自己编写方法并使用 ildasm.exe 查看它,可以更好地了解 IL 内容。在 ildasm 中使用 View + Show bytes 查看字节值,注意它们是十六进制的:

.method public hidebysig newslot virtual 
instance bool Equals(object obj) cil managed
// SIG: 20 01 02 1C
{
// Method begins at RVA 0x2052
// Code size 8 (0x8)
.maxstack 8
IL_0000: /* 02 | */ ldarg.0
IL_0001: /* 03 | */ ldarg.1
IL_0002: /* 28 | (0A)000010 */ call bool [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::Equals(object,
object)
IL_0007: /* 2A | */ ret
} // end of method Program::Equals

现在您将看到 IL_0003 处的字节是方法标记 的一部分,是它的最低有效字节。并注意我得到的值与你得到的值有何不同。这是因为我只是用很少的代码编写了一个非常小的程序来测试它,它有一个非常小的 list 。反汇编程序很有用,它实际上在元数据表中查找并用方法名称替换了 token ,而不是仅显示 token 值。

token 是程序集 list 元数据表中的索引。当程序集中的代码更改并需要向表中添加内容时,这样的索引将更改。您可以在 CLI 规范中阅读更多相关信息,ECMA 335 .

关于.net - 为什么 MethodBody.GetILAsByteArray 在不同的平台上返回不同的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14956806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com