Я создал службу 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, компилируется как:

  1. x64: сборки AnyCPU с использованием JIT для компиляции версий сборок x64 (медленно). Сборки x86 получат исключение BadImageFormatException.
  2. x86: AnyCPU собирает JIT в x86. Сборки x64 получат исключение BadImageFormatException.
  3. AnyCPU:.Net будет по умолчанию для x86. Смотри выше.

Я часто использую стартовое приложение, где я явно компилирую.exe как x64 или x86 и поставляю версии.msi для x86 и x86. Вероятно, это самый простой путь - увеличение производительности, как правило, стоит затрат на управление дополнительными файлами.

В качестве альтернативы, вы можете использовать ngen во время процесса установки, который будет выполнять всю работу JIT при установке приложения. Вы заметите улучшение времени запуска для вашего приложения.

Кроме того, как я недавно обнаружил в приложениях x86, для приложений.net существует ограничение в 2 ГБ памяти. Это происходит даже тогда, когда у вас есть 4 ГБ оперативной памяти на вашем x86 и у вас осталось много памяти.

Другие вопросы по тегам