2008-10-10 29 views
8

¿Solo me pregunto si una aplicación .NET se puede compilar con código de máquina nativo antes de tiempo? No estoy planeando hacerlo, incluso si pudiera; Tengo curiosidad.¿Se puede compilar una aplicación .NET en nativo?

Gracias

+1

@Cody Gracias por las correcciones ortográficas que me enseñarán a no leer las pruebas antes de presionar enter. –

Respuesta

11

Puede utilizar NGen compilarlo antes de tiempo, pero esto todavía depende de la plataforma .NET. Remotesoft's Salamander (una aplicación comercial) puede hacer una aplicación sin marco.

1

ngen se puede utilizar para 'pre-JIT' una imagen, por lo que está disponible en el disco en forma nativa para reducir el tiempo de inicio de la aplicación.

+0

BTW: ¿Las aplicaciones compiladas por ngen se ejecutan más lentamente que el .net estándar (a pesar del tiempo de inicio)? Pensé que el compilador de JIT podría hacer muchas optimizaciones durante el tiempo de ejecución, especialmente con lambda-expressions. – Dario

5

PUEDE compilar IL en binarios nativos. Hay productos que lo hacen.

La pregunta más grande es que debe ...

Si desea eliminar todas las dependencias dot net para funcionar sin la red del punto

Básicamente lo que estos productos están haciendo es precompilar hasta el nivel de la máquina (x86 generalmente) y luego estáticamente incluyendo todas las bibliotecas requeridas en su exe. Eso generalmente resulta en un ENORME exe. Y, lo que es más importante, ahora no tiene realmente el tiempo de ejecución en su máquina objetivo. Usted tiene una parte del tiempo de ejecución que el compilador nativo eligió incorporar.

Si desea obtener sólo un tiempo más rápido JIT

También puede utilizar NGen compilarlo a un binario nativo, pero todavía tiene todas las dependencias de la red del punto. Las máquinas de destino aún necesitan el marco, etc.

Pero, cuando usted pierde, pierde la capacidad de la aplicación para promocionar automáticamente hasta 64 bit. Si su aplicación está precompilada, debe forzar un modo. Si un usuario se está ejecutando en una máquina de 64 bits, su código IL se habría promovido (a menos que lo marque como no).

El tiempo de JIT no es su mayor cuello de botella en la mayoría de las aplicaciones. Es la carga de las bibliotecas de framework y otros requisitos relacionados.

Si realmente lo necesita, puede utilizar una aplicación de configuración para obtener la máquina de destino de los usuarios actuales.

También recientemente descubrí que no puede NGEN una aplicación y espera que aproveche la CPU como lo hace con el JIT. Cuando ejecuta NGEN, siempre optimiza la salida de un PentiumPro por algún motivo, y no aprovechará elementos como SSE, SSE2, etc. Por lo tanto, diría que elimina NGEN como un caso de uso razonable.

1

Mono tiene una anticipación de tiempo (AOT) compiler que puede emitir código nativo.

Cuestiones relacionadas