c# - framework - ¿Cuál es la diferencia entre.NET Native y Ngen.exe?
.net framework native (2)
El título lo dice todo. Esperaba que alguien pudiera explicarme qué trae a la mesa .NET Native que no teníamos con Ngen.exe.
Por lo que sé, Ngen aún depende del marco, que .NET Native no lo hace cuando llega a la producción de acuerdo con las preguntas frecuentes.
¿Se trata solo de rendimiento o esto también permite la creación de código C # (por ejemplo) que se compila de forma nativa para Win32 / 64 y no requiere la instalación de .NET Framework en la máquina de destino?
Eso es correcto: .NET Native no se trata solo de rendimiento, sino también de productividad y una experiencia de dispositivo consistente. .NET Native le permite escribir código usando idiomas administrados y cargar paquetes MSIL como siempre. Sin embargo, las aplicaciones se implementarán en los dispositivos del usuario final como un código compilado de forma nativa y totalmente independiente (cuando .NET Native entre en producción) y no tendrá una dependencia de .NET Framework en el dispositivo / máquina de destino. Como saben, las aplicaciones .NET abarcan un amplio espectro. Por lo tanto, también estamos invirtiendo mucho en el completo .NET Framework (por ejemplo, acabamos de lanzar un CTP de RyuJIT).
Puede pensar en .NET Native como una evolución de la tecnología NGen que utiliza el CLR de escritorio. Hay algunas formas principales en que .NET Native y NGEN difieren:
- Dependencia del tiempo de ejecución : NGEN usa el CLR de escritorio completo, .NET Native utiliza un tiempo de ejecución refactorizado (mrt100_app.dll) que es la aplicación local. El tiempo de ejecución nativo de .NET se ha refactorizado para mover la mayoría de las funcionalidades de la aplicación a la cadena de herramientas de generación de código. Esto lo hace mucho más pequeño, más paga por jugar y (con suerte) más debugable en tiempo de ejecución. Una aplicación nativa .NET también es autónoma, lo que es una propiedad útil para una aplicación.
- Dependencias de imágenes nativas : una imagen NGEN está estrechamente vinculada tanto al CLR con el que se ejecuta como a la imagen NGEN de sus ensamblajes dependientes. Esto, por ejemplo, hace que casi todas las imágenes NGEN deban regenerarse cuando se realiza una corrección de errores en mscorlib.dll.
- Ubicación de la compilación : el objetivo de .NET Native es que el código nativo se genere en la tienda de aplicaciones. NGEN genera código nativo en el dispositivo del usuario final. Sin duda, puede imaginar que para ciertas clases de dispositivos (es decir, teléfonos, tabletas) preferiría no desperdiciar el código de generación de batería del usuario final. La compilación en la tienda también permite a .NET Native dedicar más tiempo a la compilación, lo que le permite aplicar más optimizaciones de las que NGEN puede permitirse.
- Generador de código : NGEN usa el compilador JIT para generar código, .NET Native utiliza el extremo posterior del compilador de Visual C ++, que nos permite aplicar optimizaciones, como la vectorización automática, que son demasiado caras para aplicar en el caso JIT
- Análisis de todo el programa : NGEN genera código para un único ensamblaje a la vez, lo que permite utilizar una imagen NGEN en múltiples contextos de aplicación. .NET Native genera código para un paquete de aplicación completo, lo que le permite aplicar un conjunto más amplio de optimizaciones (por ejemplo, eliminar completamente el código que nunca se usa en tiempo de ejecución). Esto se combina con un marco refactorizado que permite que estas optimizaciones se activen tanto como sea posible.
- IL Fallback : las imágenes NGEN contienen tanto el código nativo como MSIL para un ensamblaje (entre otras estructuras de datos). Si ocurre algo en el tiempo de ejecución que hace que el CLR necesite un código nativo que no puede encontrar en la imagen NGEN, puede recurrir a JITing. En las previsualizaciones de los desarrolladores actuales de .NET Native, solo el código nativo está presente en la imagen nativa. Esto significa que si el código no está presente en la imagen, nunca se ejecutará en tiempo de ejecución.