Я рассматриваю метод экземпляра Object.Equals (Object). С помощью отражения, это Возможное, чтобы получить IL для этого метода в виде массива байтов, следующим образом:Почему метод MethodBody.GetILAsByteArray возвращает разные массивы на разных платформах?
var mi = typeof(object).GetMethod("Equals", BindingFlags.Instance | BindingFlags.Public);
var mb = mi.GetMethodBody();
var bytes = mb.GetILAsByteArray();
У меня есть два компьютера: один является 32-разрядной машине под управлением Windows XP, а другой 64-разрядный с Windows 7. Обе машины имеют версию 4.0.30319 SP1Rel установленной платформы .NET Framework.
На машине 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 я нацелил вышеуказанный код как на «Любой процессор», так и на «x86», но результат тот же.
Так что мой вопрос: может ли кто-нибудь объяснить отмеченное несоответствие между двумя машинами?
ОБНОВЛЕНИЕ
Вот C# и ИЛЫ для 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
Возможно, вы могли бы показать нам ИЛ, так что, возможно, у нас есть ключ к тому, какой метод там называется. Первые три байта: 'ldarg.0'' ldarg.1' и 'call'. Цель, начинающаяся с четвертого байта. –
Я сделал это. См. Обновление. –