2008-10-29 3 views
5

Извините, если какой-либо из того, что я собираюсь сказать, не имеет смысла или пропускает что-то очевидное - мои знания о внутренних средах CLR являются пятнистыми.x64 .NET компиляция/Неотложность процесса Explorer

Если я правильно понял, то, если я просто создаю решение для «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-разрядный, как указано выше?

ответ

5

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

Пункт установки «Любой процессор» - заставить наиболее распространенный знаменатель как на собственном изображении, так и на сборке, так что он позволяет загрузочному блоку Windows для .NET выбирать, какой вид времени выполнения будет наиболее подходящим для текущей платформы.

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

2

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

справа, вы можете проверить, выполнив тот же ехе, скомпилированные для AnyCPU:

SizeOf (IntPtr) == 4 // истинна на 32bit

SizeOf (IntPtr) == 8 // истинный на 64-разрядном

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

+0

thanks :) любая идея, почему Process Explorer вреден? – 2008-10-29 17:10:39