Я создал службу Windows как "Любой процессор". Почему он работает в 32-битном режиме на моем 64-битном компьютере?
Я создал службу Windows как "Любой процессор". Однако, когда я запускаю его на моей 64-битной машине, он работает на 32-битной. Как я могу это исправить? Я использую.NET и C#, и моя операционная система - Windows 2008 R2.
Если я собираю его в x64, он корректно загружается в 64-битном режиме. Тем не менее, "Любой процессор" - это то, что я хочу - загружается в 32-битной, хотя машина, на которой он работает, прекрасно поддерживает 64-битную.
РЕДАКТИРОВАТЬ, чтобы добавить больше информации на основе обратной связи
У нас есть сторонние инструменты, а также ссылка на управляемую сборку C++. Они могут или не могут быть построены для любого процессора. На самом деле я знаю, что управляемая сборка C++ создана только для x86. Однако странным является то, что, если я специально укажу x64, процесс запустится и будет работать в x64. Если фреймворк попытается загрузить управляемую сборку C++, она потерпит неудачу. Я не против, потому что в коде мы не загружаем 32-битную управляемую сборку ++, если работаем в 64-битном режиме. Может ли быть так, что сборка показывает, что, поскольку здесь есть 32-битная сборка, она должна пометить процесс запуска (в данном случае сборку службы Windows) как x86?
4 ответа
На случай, если кто-нибудь столкнется с тем же, что и я: я создал две новые настройки конфигурации (скопированные из конфигурации отладки). По какой-то причине флаг "Prefer32Bit" был установлен в true, хотя флажок был серым и не отмечен на странице конфигурации проекта.
Вы можете исправить это, удалив строку прямо из файла.csproj.
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Staging|AnyCPU'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\Staging\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit> <!-- REMOVE THIS LINE -->
</PropertyGroup>
Существует настройка, которая может заставить сборки AnyCPU работать как 32-разрядные в ОС x64.
Используйте ldr64.exe из каталога.Net2 x64 для проверки статуса:
C: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727> ldr64.exe запрос загрузка kernel32... сделано. извлеченная точка входа GetComPlusPackageInstallStatus извлеченная точка входа SetComPlusPackageInstallStatus Текущий статус: 0x00000001
1 - означает "запустить AnyCPU как 64-битный"
0 - означает "запустить AnyCPU как 32-битный"
Хотя я не нашел такой утилиты в папке.Net v4, настройка применима и к сборкам Net4 AnyCPU. Этот флаг сохраняется в значении реестра DWORD Enable64Bit под ключом HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework
Кажется, этот параметр загружается при запуске ОС, и изменение только значения реестра не влияет на приложения до перезагрузки. Изменение флага с помощью ldr64.exe вступает в силу немедленно.
Обратите внимание, что этот параметр является общесистемным. По умолчанию Enable64Bit установлен в 1. Кажется, что какое-то приложение сбрасывает его в 0, и возврат значения обратно может вызвать проблемы для этого приложения.
Благодаря этому ответу. Я использую CorFlags, чтобы он работал как 64-битный
corflags.exe WindowService.exe /32bitpref- /32bitreq-
Версия CorFlags, которую я использовал, была 4.0.30319.17929, которую я нашел в C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools
, Вы можете попробовать старые версии со следующим:
corflags.exe WindowService.exe /32bit-
Если exe приложения, которое запускает CLR, компилируется как:
- x64: сборки AnyCPU с использованием JIT для компиляции версий сборок x64 (медленно). Сборки x86 получат исключение BadImageFormatException.
- x86: AnyCPU собирает JIT в x86. Сборки x64 получат исключение BadImageFormatException.
- AnyCPU:.Net будет по умолчанию для x86. Смотри выше.
Я часто использую стартовое приложение, где я явно компилирую.exe как x64 или x86 и поставляю версии.msi для x86 и x86. Вероятно, это самый простой путь - увеличение производительности, как правило, стоит затрат на управление дополнительными файлами.
В качестве альтернативы, вы можете использовать ngen во время процесса установки, который будет выполнять всю работу JIT при установке приложения. Вы заметите улучшение времени запуска для вашего приложения.
Кроме того, как я недавно обнаружил в приложениях x86, для приложений.net существует ограничение в 2 ГБ памяти. Это происходит даже тогда, когда у вас есть 4 ГБ оперативной памяти на вашем x86 и у вас осталось много памяти.