У меня есть проект, который генерирует 32-битный исполняемый файл. Этот исполняемый файл входит в состав более крупного пакета, в котором исполняемый файл устанавливается как служба Windows с помощью установщика MSI. Несмотря на то, что исполняемый файл является 32-разрядным (я изучил заголовок файла), процесс выполняется как 64-разрядный процесс. Я пытался отладить этот процесс, и когда я открыл меню «Присоединить процесс» через Visual Studio, я увидел, что его тип включает x64 вместо x86.
Это возможно или я что-то упускаю? Если возможно, как я могу сделать это для другого 32-битного исполняемого файла?
@PMF Это исполняемый файл .NET.
Исполняемый файл .NET точно такой же, как приложения Java или Dalvik, они содержат байт-коды и запускаются на виртуальной машине, поэтому, очевидно, они будут скомпилированы для любых собственных платформ. Они будут работать даже на ARM, RISC-V, PPC... пока доступна соответствующая виртуальная машина.
Для исполняемых файлов .NET это нормально. Исполняемые файлы .NET запускаются в любой подходящей среде, в зависимости от доступного оборудования и версии среды выполнения. Можно принудительно запустить исполняемый файл .NET в 32-битном режиме, но обычно это делается только тогда, когда ему необходимо взаимодействовать с 32-битной собственной dll.
Детали немного различаются между сборками .NET Framework и сборками .NET Core/NET5.0+. Но в последнем случае целевая среда выполнения указывает, запускает ли она двоичный файл в 32-битном или 64-битном режиме. Теперь это легко, так как приложение почти всегда построено в режиме «Любой ЦП», сообщая среде выполнения, что приложению все равно, какой ЦП используется (или какая операционная система, оборудование и т. д.)
У меня есть 2 версии этого исполняемого файла, обе 32-разрядные, но одна работает как 64-разрядная служба Windows, а другая — как 32-разрядная служба. Это из-за того, как они построены? Вероятно, один использовал «Любой процессор», а другой использовал какую-то другую конфигурацию?
Это возможно. Вы используете .NET Framework или .NET Core?
Я использую .NET Framework
Для .NET Framework это встроено в код. Во время компиляции вы можете объявить, хотите ли вы запускать приложение в 32-битном или 64-битном режиме (или решить во время выполнения). Так что да, вполне вероятно, что две версии были созданы с разными настройками.
Вы были правы, я смог запустить второй 32-битный исполняемый файл как 64-битный процесс после того, как изменил настройки сборки. У вас есть какой-нибудь документ/видео, где я могу больше узнать об этих вещах, особенно для .NET?
Нет, мне нужно будет найти это самому. Я слишком долго боролся с этим. Но в настоящее время вы можете просто перейти на 64-битную версию и все, потому что 32-битная Windows практически мертва.
Это исполняемый файл .NET или собственный двоичный файл?