2012-10-08 11 views
14

En VS2012 (y versiones anteriores ...), puede especificar la plataforma de destino al construir un proyecto. Entiendo, sin embargo, que C# se "compila" a CIL y luego se compila JIT cuando se ejecuta en el sistema host.¿La configuración de la plataforma al compilar una aplicación C# marca la diferencia?

¿Esto significa que las razones solo para especificar una plataforma objetivo son restringir deliberadamente a los usuarios de ejecutar el software en ciertas arquitecturas o forzar a la aplicación a ejecutarse como 32 bits en una máquina de 64 bits? No veo que tenga que ver con la optimización, ya que supongo que eso sucede en CIL -> Native stage, ¿qué ocurre Just-In-Time en la arquitectura del host?

This MS Link parece no ofrecer ninguna explicación alternativa y no puedo encontrar ninguna sugerencia del hecho de que, por ejemplo, debería lanzar versiones separadas de 32/64 bits de la misma aplicación, parece lógico que algo compilado para " anycpu "debería funcionar igual de bien y, nuevamente, las optimizaciones se aplicarán en la etapa JIT.

+0

No sé si ha cambiado en VS2012, pero la función "editar y continuar" no funciona al depurar aplicaciones en modo de 64 bits en VS2010. – David

+0

@Davis: No tiene. (pero ahora puede usar E & C para editar cuerpos de métodos que contengan métodos anónimos o lambdas, menos los enunciados reales donde aparecen) –

Respuesta

16

¿Esto significa que las únicas razones para especificar una plataforma de destino son restringir deliberadamente a los usuarios de ejecutar el software en ciertas arquitecturas o forzar la aplicación para ejecutarse como 32 bits en una máquina de 64 bits?

Sí, y esto es fundamental si está utilizando código nativo mezclado con su código administrado. Sin embargo, no cambia lo que se optimiza en tiempo de ejecución.

Si su código es 100% administrado, entonces AnyCPU (o el nuevo AnyCPU Prefer 32-Bit) probablemente esté bien. Las optimizaciones del compilador serán las mismas, y el JIT optimizará en tiempo de ejecución en función de la plataforma de ejecución actual.

puedo encontrar ninguna sugerencia de que se debe, por ejemplo, la liberación separadas las versiones de 32 bits/64 de la misma aplicación

No hay ninguna razón para hacer esto a menos que se está realizando interoperabilidad con código no administrado, en cuyo caso, eso requerirá archivos DLL de 32 y 64 bits por separado.

+0

¿Las cosas P/Invocar o "inseguras" dependen de esta configuración? (Supongo que esos podrían considerarse no 100% administrados ...) –

+0

@pst P/Invoke está yendo en contra de lo nativo, por lo que importa allí (a menos que tenga algún modo, en tiempo de ejecución, para asegurarse de que solo está llegando a las DLL de la plataforma correcta), pero no es un problema de optimización, es una corrección problema. –

+1

@pst - Sí. Debido a que establecer esta bandera de plataforma (si se usa en el ejecutable de entrada responsable de iniciar el tiempo de ejecución) dará como resultado que el código se cargue en un espacio de memoria de 32 o 64 bits. Si su p/invoke está escrito para esperar que los punteros y otros tipos específicos de memoria tengan dimensiones de 32 bits, y que se carguen en un tiempo de ejecución de 64 bits (o viceversa), las cosas fallarán. – Adam

12

Reed tiene una buena respuesta aquí. Sin embargo, creo que también es importante señalar que esta configuración es solo una bandera en el archivo DLL, prácticamente no tiene ningún efecto en la mayoría de las situaciones . Es la responsabilidad del cargador de tiempo de ejecución (el bit de código nativo que inicia el tiempo de ejecución de .NET) mirar este indicador y dirigir la versión adecuada del tiempo de ejecución de .NET para que se inicie.

Debido a esto, la bandera en su mayoría solo importa cuando se establece en un archivo EXE, y no tienen ningún efecto cuando se establece en una DLL. Por ejemplo, si tiene una DLL '32-bit-flagged .NET que es utilizada por un EXE .NET marcado con 64-bit, o un EXE .NET marcado por cualquier CPU, y ejecuta el EXE en una máquina de 64 bits; luego, el cargador iniciará el tiempo de ejecución de 64 bits. Cuando llega el momento de cargar el archivo DLL de 32 bits, ya es demasiado tarde: ya se ha elegido el tiempo de ejecución de 64 bits, por lo que su programa fallará (creo que es una BadImageFormatException que recibirá).

+0

+1 Muy buen complemento a la respuesta de Reed. Y sí, tienes razón sobre el error 'BadImageFormatException'. – Icarus

Cuestiones relacionadas