winsdk net microsoft framework .net x86 64bit multi-targeting

.net - net - sdk de windows



Creé un servicio de Windows como "Cualquier CPU". ¿Por qué se ejecuta en modo de 32 bits en mi máquina de 64 bits? (4)

En caso de que alguien se encuentre con lo mismo que yo, creé dos nuevas configuraciones (copiadas de la configuración de Debug). Por alguna razón, el indicador "Prefer32Bit" se estableció en verdadero, aunque la casilla de verificación estaba en gris y desmarcada en la página de configuración del proyecto .

Puede solucionarlo eliminando la línea directamente del archivo .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>

Esta pregunta ya tiene una respuesta aquí:

Creé un servicio de Windows como "Cualquier CPU". Sin embargo, cuando lo ejecuto en mi máquina de 64 bits, se ejecuta en 32 bits. ¿Cómo puedo arreglarlo? Estoy usando .NET y C #, y mi sistema operativo es Windows 2008 R2.

Si lo construyo en x64, se carga correctamente en el modo de 64 bits. Sin embargo, "Any Cpu", que es lo que quiero, se carga en 32 bits, aunque la máquina en la que se ejecuta admite perfectamente 64 bits.

EDITAR para agregar más información basada en comentarios

Tenemos herramientas de terceros, así como referencias a un conjunto gestionado por c ++. Estos pueden o no estar diseñados para cualquier CPU. De hecho, sé que el ensamblado administrado por c ++ solo se construye para x86. Sin embargo, lo extraño es que si especifico x64 específicamente, el proceso se iniciará y funcionará en x64. Si el framework intentara cargar el ensamblado administrado por c ++, fallaría. No me molesta esto, porque en el código, no cargamos el ensamblado ++ de 32 bits si estamos trabajando en el modo de 64 bits. ¿Podría ser que la construcción cuente que, dado que hay un ensamblaje de 32 bits aquí, debería marcarse el proceso de lanzamiento (en este caso un conjunto de servicios de Windows) como x86?


Gracias a esta respuesta . Yo uso CorFlags para que se ejecute como 64 bits

corflags.exe WindowService.exe /32bitpref- /32bitreq-

La versión de CorFlags que utilicé fue 4.0.30319.17929, que encontré en C:/Program Files (x86)/Microsoft SDKs/Windows/v8.0A/bin/NETFX 4.0 Tools . Puede probar las versiones anteriores con lo siguiente:

corflags.exe WindowService.exe /32bit-


Hay una configuración que puede obligar a los ensamblajes AnyCPU a ejecutarse como de 32 bits en el sistema operativo x64.
Use ldr64.exe del directorio .Net2 x64 para verificar el estado:

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 - significa ''ejecutar AnyCPU como 64 bits''
0 - significa ''ejecutar AnyCPU como 32 bits''

Aunque no encontré esa utilidad en la carpeta .Net v4, la configuración también se aplica a los ensamblados Net4 AnyCPU. Este indicador se guarda en el valor de registro DWORD Enable64Bit bajo la clave HKEY_LOCAL_MACHINE / SOFTWARE / Microsoft / .NETFramework

Esta configuración parece estar cargada en el inicio del sistema operativo, y cambiar solo el valor del registro no afecta a las aplicaciones hasta que se reinicia. Cambiar el indicador con ldr64.exe afecta inmediatamente.

Tenga en cuenta que esta configuración es para todo el sistema. Por defecto, Enable64Bit está configurado en 1. Parece que alguna aplicación lo restablece a 0, y revertir el valor puede causar problemas a esa aplicación.


Si el exe de la aplicación que inicia el CLR se compila como:

  1. x64: Cualquier ensamblado de CPU con JIT de uso para compilar versiones x64 de los ensamblajes (lento). Los ensamblados x86 obtendrán una BadImageFormatException.
  2. x86: Cualquiera de los ensamblados de la CPU JIT a x86. Los ensamblados x64 obtendrán una BadImageFormatException.
  3. AnyCPU: .Net se establecerá de manera predeterminada en x86. Véase más arriba.

A menudo uso una aplicación de inicio, donde explícitamente compilo el .exe como x64 o x86 y envío las versiones x86 y x86 del .msi. Esta es probablemente la ruta más fácil: la ganancia de rendimiento generalmente vale la pena sobrecargar los archivos adicionales.

Alternativamente, puede usar ngen durante el proceso de configuración, que hará todas las cosas de JIT cuando la aplicación esté instalada. Notará tiempos de inicio mejorados para su aplicación.

Además, como descubrí recientemente con las aplicaciones x86, hay un límite de memoria de 2 GB para las aplicaciones .net. Esto ocurre incluso cuando tiene 4 gb de ram en su x86 y le quedan montones de memoria.