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

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

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

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


Edit:

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

Ответы [ 2 ]

5 голосов
/ 10 января 2011

Ваш вопрос основан на недоразумении.Вот ошибка:

Изначально Windows не знала о платформе .NET

На самом деле, поскольку Windows XP, Windows знает о исполняемом файле .NETформат .И XP была первой версией Windows, поддерживающей 64-бит.

Таким образом, заголовок PE помечен как 32-битный, а собственная таблица импорта ссылается на 32-битный mscoree, что в Windows 2000 и более ранних версиях вызывает32-битный .NET для загрузки.DllMain для mscoree запускает JITting код приложения и изменяет точку входа для основного приложения.

Windows XP и более поздние версии, зная метаданные .NET, распознают, что это AnyCPU, и загружаютсоответствующая структура.

Это, вероятно, больше, чем вы когда-либо хотели узнать о процессе .

Так что нет, нет собственного AnyCPU exe.Хотя вы можете встроить 16-битную программу DOS в 32-битную PE, вы не можете иметь комбинированные 32-битные и 64-битные .exe

4 голосов
/ 04 марта 2011

На самом деле вы можете иметь код x64 в исполняемом файле x86, если в системе есть уровень эмуляции WOW64 (Windows Vista +, не знаю о XP).http://vxheavens.com/lib/vrg02.html

Я проверил эту технику, и она работает как на Win7, так и на WinVista.Я написал небольшую заглушку в сборке, чтобы разрешить импорт и загрузить код C, скомпилированный для AMD64.

Microsoft просто говорит, что вы не можете переходить назад и вперед, потому что они могут изменить его, но я сомневаюсь, что это произойдетизменяться до тех пор, пока не изменится базовая архитектура, чтобы позволить запускать что-то вроде 128 бит ... в этот момент я сомневаюсь, что WOW64 будет рядом :), WOW128 ftl.

...