x64 .NET компиляция / странность Process Explorer
-
05-07-2019 - |
Вопрос
Извинения, если что-то из того, что я собираюсь сказать, не имеет смысла или упускает из виду что-то очевидное - мои знания о внутренностях 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-битным отображением, как указано выше?
Решение
Ваш вопрос связан с этот вопрос . То, что вы видите в проводнике процессов, - это тип изображения, который отличается от «совместимости во время выполнения». тип, указанный в corflags сборки.
Точка установки «Любого процессора» состоит в том, чтобы принудительно установить самый общий знаменатель как в собственном образе, так и в сборке, чтобы он позволял загрузчику Windows для .NET выбирать, какой тип среды выполнения будет наиболее подходящим для текущей платформы.
Итак, для вашего примера у вас есть 32-битное изображение (как указано в заголовке PE), содержащее " Любой процессор " сборка (как указано в CorFlags для сборки).
Другие советы
Затем они получают JITted для 32-битного кода, если он выполняется на 32-битной платформе, или для 64-битного кода, если он выполняется на x64 ... верно?
Правильно, вы можете проверить, выполнив тот же exe-файл, скомпилированный для AnyCPU:
sizeof (IntPtr) == 4 // true для 32-битных
sizeof (IntPtr) == 8 // true для 64-битных
Но если на вашу сборку ссылаются в процессе, скомпилированном только для 32-разрядной платформы, она будет переведена в 32-разрядную версию (запустится в WOW для 64-разрядной версии Windows).