Подтвердить что ты не робот

Я создал службу Windows как "Любой процессор". Почему он работает в 32-битном режиме на моей 64-битной машине?

Я построил службу Windows как "Любой процессор". Однако, когда я запускаю его на своей 64-битной машине, он работает в 32 бит. Как я могу это исправить? Я использую .NET и С#, а моей операционной системой является Windows 2008 R2.

Если я построю его в x64, он правильно загрузится в режиме 64 бит. Однако "Any Cpu" - то, что я хочу - загружается в 32 бит, хотя машина, на которой он работает, отлично поддерживает 64-разрядную версию.

РЕДАКТИРОВАТЬ, чтобы добавить дополнительную информацию на основе обратной связи

У нас есть сторонние инструменты, а также ссылка на управляемую сборку С++. Они могут или не могут быть построены для любого CPU. На самом деле я знаю, что управляемая сборка С++ построена только для x86. Тем не менее, странно, что если я конкретно укажу x64, процесс запустится и будет работать в x64. Если инфраструктура должна была попытаться загрузить управляемую сборку С++, она потерпит неудачу. Я не против этого, потому что в коде мы не загружаем 32-битную управляемую сборку ++, если мы работаем в режиме 64 бит. Может ли быть так, что строит цифра, что, поскольку здесь есть 32-битная сборка, она должна отметить процесс запуска (в данном случае сборку служб Windows) как x86?

4b9b3361

Ответ 1

В случае, если кто-то сталкивается с тем же, что и я: я создал две новые настройки конфигурации (скопированные из конфигурации Debug). По какой-то причине флаг "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>

Ответ 2

Там параметр, который может заставить сборки AnyCPU работать как 32-разрядные на ОС x64.
Используйте ldr64.exe из каталога.Net2 x64, чтобы проверить статус:

C:\Windows\Microsoft.NET\Framework64\v2.0.50727>ldr64.exe query
loading kernel32...done.
retrieved GetComPlusPackageInstallStatus entry point
retrieved SetComPlusPackageInstallStatus entry point
Current status is: 0x00000001

1 - означает "запустить AnyCPU как 64-битный"
0 - означает "запустить AnyCPU как 32-битный"

Хотя я не нашел такую утилиту в папке.Net v4, этот параметр применим и к сборкам Net4 AnyCPU. Этот флаг сохраняется в значении реестра DWORD Enable64Bit под ключом HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework

Этот параметр, кажется, загружается при запуске ОС, и изменение только значения реестра не влияет на приложения до перезагрузки. Изменение флага с помощью ldr64.exe вступает в силу немедленно.

Обратите внимание, что этот параметр является общесистемным. По умолчанию Enable64Bit установлен в 1. Кажется, что какое-то приложение сбрасывает его на 0, а возврат обратно обратно может вызвать проблему для этого приложения.

Ответ 3

Благодаря этому ответу. Я использую 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-

Ответ 4

Если приложение exe, которое запускает CLR, скомпилируется как:

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

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

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

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