+1 Боже мой, это так здорово! : D спасибо, что поделились этим!

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

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

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

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

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

 user16639010 янв. 2011 г., 04:55
Есть некоторые программы (например, Process Explores), которые делают это, распространяя 32-битный исполняемый файл, которыйкатера 64-битное изображение, если это возможно. Например. исполняемый файл AnyCPU когда-либо, кроме 32-битного PE?
 Mehrdad10 янв. 2011 г., 04:59
@pst: я полностью знаю об этом, но нет, они разные. Исполняемые файлы AnyCPU являются 64-битными с момента их запуска в 64-битных ОС - нет распаковки и нет ничего похожего на «Давайте JIT-код этого байт-кода в 64-битный, а затем перезапустить 64-битный процесс». Это то, что оставляет меня в замешательстве.

Ответы на вопрос(2)

если система имеет уровень эмуляции WOW64 (Windows Vista +, не знаю о XP).http://vxheavens.com/lib/vrg02.html

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

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

 Mehrdad04 мар. 2011 г., 20:50
+1 Боже мой, это так здорово! : D спасибо, что поделились этим!
Решение Вопроса

Изначально Windows не знала о .NET Framework

На самом деле, начиная с 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

 Ben Voigt10 янв. 2011 г., 05:17
@Lambert: Периоды разработки пересекались, разработка .NET началась примерно за 5 лет до первоначального выпуска в 2002 году, поэтому у Microsoft есть достаточно времени, чтобы подключить XP. И, как я уже сказал, Windows 2000 только 32-битная. Во всяком случае, это дата выпуска 64-разрядной версии Windows XP, несколько лет спустя, которую вы должны рассмотреть, так как это первая версия, которая нуждалась в этой «магии».
 Mehrdad10 янв. 2011 г., 05:40
@Ben: я уже прочитал первую ссылку, но вторая была новой. Сначала я подумал, что это расскажет мне о громадинах WOW64 и обо всем этом, и хорошо, что я не жаловался, что уже знал их, потому что информация .NET была определенно новой и полезной. Спасибо за публикацию этих! Хотел бы я дать еще +1. :)
 Ben Voigt10 янв. 2011 г., 05:29
@Lambert: добавлены две ссылки, которые вы можете прочитать для получения дополнительной информации.
 Mehrdad10 янв. 2011 г., 05:15
Разве .NET Framework не вышелпосле выпуск XP (по крайней мере, это то, что я думал, что я вспомнил)? я думалXP была выпущена в 2001 году а также.NET в 2002 году...
 Mehrdad10 янв. 2011 г., 05:21
Ах ... это все объясняет. (И да, извините, я удалил часть Windows 2000 о своем комментарии прямо перед вашей публикацией, поскольку я вспомнил, что у него не было 64-битной версии.) Не тот ответ, который я искал, но определенно кажется правильным; Спасибо! :)

Ваш ответ на вопрос