net framework code .net native compilation machine-code

framework - ¿Se puede compilar una aplicación.NET en nativo?



uwp (4)

¿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.

Gracias


Puede usar NGen para compilarlo con anticipación, pero esto todavía depende del framework .NET. Remotesoft''s Salamander (una aplicación comercial) puede hacer una aplicación sin marco.


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.


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

La pregunta más importante es si ...

Si desea eliminar todas las dependencias de dot net para ejecutar sin dot net

Básicamente, lo que estos productos están haciendo es precompilar hasta el nivel de la máquina (normalmente x86) y luego, de forma estática, incluir todas las bibliotecas necesarias en su archivo ejecutable. 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 quieres obtener un tiempo JIT más rápido

También puede usar NGen para compilarlo en un binario nativo, pero todavía tiene todas las dependencias en dot net. Las máquinas de destino todavía necesitan el marco, etc.

Pero, cuando usted pierde, pierde la capacidad de la aplicación para promocionar automáticamente hasta 64 bits. 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 tu cuello de botella más grande en la mayoría de las aplicaciones. Es la carga de las bibliotecas de framework y otros requisitos relacionados.

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

También recientemente descubrí que no puedes NGEN una aplicación y esperar que aproveche la CPU como lo haces 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.


Mono tiene un compilador Ahead of Time (AET) que puede emitir código nativo.