x64 .NET компиляция / странность Process Explorer - PullRequest
5 голосов
/ 29 октября 2008

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

Если я правильно понимаю, то, если я просто создаю решение для AnyCPU в VS2K5 (или указываю MSBuild на этот файл .sln с этими настройками), то двоичные файлы компилируются только до MSIL. Затем они получают JITted до 32-битного кода, если он выполняется на 32-битной платформе, или 64-битного кода, если он выполняется на x64 ... верно?

Библиотеки DLL используются для веб-приложения и размещаются в процессе W3WP.exe. Process Explorer сообщает мне, что W3WP - это 64-битный процесс.

Но когда я использую Process Explorer для проверки свойств одной из этих библиотек DLL в представлении DLL, он говорит: «Изображение: 32-разрядное». Что дает?

Если я запускаю corflags против dll, о котором идет речь, он говорит мне: ILONLY 1, 32BIT 0, но PE PE32. Насколько я понимаю, это означает, что да, он компилируется только в IL, нет, он не ограничен ни 32-разрядным, ни 64-разрядным, но я не совсем уверен. Флаг PE32 как-то связан с тем, что он отображается как 32-битный, как указано выше?

Ответы [ 2 ]

5 голосов
/ 23 ноября 2008

Ваш вопрос относится к этому вопросу . В проводнике процессов вы видите тип изображения, который отличается от типа «совместимости во время выполнения», указанного в corflags .

сборки.

Смысл установки «Any Cpu» состоит в том, чтобы принудительно установить самый общий знаменатель как в собственном образе, так и в сборке, чтобы он позволял загрузчику Windows для .NET выбирать, какой тип среды выполнения будет наиболее подходящим для текущего платформы.

Итак, для вашего примера у вас есть 32-битное изображение (как указано в PE-заголовке), содержащее сборку «Любой ЦП» (как указано в CorFlags для сборки).

2 голосов
/ 29 октября 2008

Затем они получают JITted для 32-битного кода, если он выполняется на 32-битной платформе, или для 64-битного кода, если он выполняется на x64 ... верно?

Правильно, вы можете проверить, выполнив тот же exe-файл, скомпилированный для AnyCPU:

sizeof (IntPtr) == 4 // true на 32 бита

sizeof (IntPtr) == 8 // true на 64-битной

Но, если на вашу сборку ссылаются в процессе, скомпилированном только для 32-битной платформы, она будет перенесена на 32-битную (в WOW для 64-битной Windows).

...