Вопрос

Извинения, если что-то из того, что я собираюсь сказать, не имеет смысла или упускает из виду что-то очевидное - мои знания о внутренностях 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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top