Написание кроссплатформенной (32-битной и 64-битной) программы для Windows (например, AnyCPU в .NET)

Меня сбивает с толку, как "AnyCPU" функция .NET работает: он загружает исполняемый файл как 32-битный, если система 32-битная, и как 64-битная, если система 64-битная (что вы можете легко подтвердить с помощью диспетчера задач). Очевидно, это не невозможно.

Вопрос в том, как именно Microsoft это сделала? Первоначально Windows не знала о платформе .NET, поэтому Windows PE Loader не может искать какие-либо дополнительные функции в заголовках PE для заголовка CLR; эта функция должна быть добавлена ​​каким-то расширением режима ядра. Но .NET framework, похоже, не устанавливает ничего подобного ... Я совершенно не понимаю, как один и тот же исполняемый файл может быть одновременно 32-битным и 64-битным, тем более что дизассемблирование mscoree.dll не делает даже не показывать ссылки на недокументированные собственные функции.

Есть ли у кого-нибудь знания и / или разумные догадки относительно того, как это было сделано? Очевидно, что это возможно (поэтому я не говорю таких вещей, как «это невозможно»), и это заставляет меня попробовать написать родной кроссплатформенный EXE ...


Редактировать:

Как примечание: подумайте, как вы не можете запускать 32-битные исполняемые файлы в 64-битной среде Windows PE ... там есть , чтобы каким-то образом расширить или изменить загрузчик PE с помощью какого-то «плагина» ", верно?

8
задан Mehrdad 10 January 2011 в 04:01
поделиться