.NET Native y compilación.NET Native and Compilation

Las aplicaciones de Windows 8.1 y del escritorio de Windows destinadas a.NET Framework se escriben en un lenguaje de programación determinado y se compilan en lenguaje intermedio (IL).Windows 8.1 applications and Windows Desktop applications that target the.NET Framework are written in a particular programming language and compiled into intermediate language (IL). En runtime, el compilador Just-In-Time (JIT) es el responsable de compilar el IL en código nativo para la máquina local antes de que un método se ejecute por primera vez.At runtime, a just-in-time (JIT) compiler is responsible for compiling the IL into native code for the local machine just before a method is executed for the first time. En cambio, la cadena de herramientas de .NET Native convierte código fuente en código nativo en tiempo de compilación.In contrast, the .NET Native tool chain converts source code to native code at compile time. En este tema se compara .NET Native con otras tecnologías de compilación disponibles para las aplicaciones de .NET Framework. Asimismo, también se proporciona información general práctica sobre el modo en que .NET Native genera código nativo que sirve para comprender por qué las excepciones que se producen en el código compilado con .NET Native no se producen en código compilado JIT.This topic compares .NET Native with other compilation technologies available for .NET Framework apps, and also provides a practical overview of how .NET Native produces native code that can help you understand why exceptions that occur in code compiled with .NET Native do not occur in JIT-compiled code.

.NET Native: generación de archivos binarios nativos.NET Native: Generating native binaries

Una aplicación que está destinada a .NET Framework y no se compila mediante la cadena de herramientas de .NET Native se compone del ensamblado de aplicación, que incluye lo siguiente:An application that targets the .NET Framework and that is not compiled by using the .NET Native tool chain consists of your application assembly, which includes the following:

  • Los metadatos que describen el ensamblado, sus dependencias, los tipos que contiene y sus miembros.Metadata that describes the assembly, its dependencies, the types it contains, and their members. Los metadatos se usan para la reflexión y acceso en tiempo de ejecución y en algunos casos también por el compilador y las herramientas de compilación.The metadata is used for reflection and late-bound access, and in some cases by compiler and build tools as well.

  • Código de implementaciónImplementation code. Se compone de códigos de operación de lenguaje intermedio (IL).This consists of intermediate language (IL) opcodes. En runtime, el compilador de Just-In-Time (JIT) lo convierte en código nativo para la plataforma de destino.At runtime, the just-in-time (JIT) compiler translates it into native code for the target platform.

Además de su ensamblado de aplicación principal, una aplicación requiere lo siguiente:In addition to your main application assembly, an app requires that the following be present:

  • Las bibliotecas de clases adicionales o ensamblados de terceros que requiera su aplicación.Any additional class libraries or third-party assemblies that are required by your app. De forma similar, estos ensamblados incluyen metadatos que describen el ensamblado, sus tipos y sus miembros, así como el IL que implementa todos los miembros de tipo.These assemblies similarly include metadata that describes the assembly, its types, and their members, as well as the IL that implements all type members.

  • La biblioteca de clases de .NET Framework.The .NET Framework Class Library. Se trata de una colección de ensamblados que se instala en el sistema local cuando se instala .NET Framework.This is a collection of assemblies that is installed on the local system with the .NET Framework installation. Los ensamblados de la biblioteca de clases de .NET Framework incluyen un conjunto completo de metadatos y código de implementación.The assemblies included in the .NET Framework Class Library include a complete set of metadata and implementation code.

  • Common Language Runtime.The common language runtime. Se trata de una colección de bibliotecas de vínculos dinámicos que realizan servicios como la carga de ensamblados, la recolección de elementos no utilizados y la administración de memoria, el control de excepciones, compilación Just-In-Time, comunicación remota e interoperabilidad.This is a collection of dynamic link libraries that perform such services as assembly loading, memory management and garbage collection, exception handling, just-in-time compilation, remoting, and interop. Al igual que la biblioteca de clases, el runtime se instala en el sistema local como parte de la instalación de .NET Framework.Like the class library, the runtime is installed on the local system as part of the .NET Framework installation.

Tenga en cuenta que, para que la aplicación se ejecute correctamente, deben estar presentes la totalidad de Common Language Runtime, los metadatos y el lenguaje intermedio de todos los tipos de ensamblados específicos de la aplicación, los ensamblados de terceros y los ensamblados del sistema.Note that the entire common language runtime, as well as metadata and IL for all types in application-specific assemblies, third-party assemblies, and system assemblies must be present for the app to execute successfully.

Compilación de .NET Native y Just-In-Time.NET Native and just-in-time compilation

La entrada de la cadena de herramientas de .NET Native es la aplicación de la Tienda Windows creada por el compilador de C# o de Visual Basic.The input for the .NET Native tool chain is the Windows store app built by the C# or Visual Basic compiler. En otras palabras, la cadena de herramientas de .NET Native empieza a ejecutarse cuando el compilador de lenguaje ha finalizado la compilación de una aplicación de la Tienda Windows.In other words, the .NET Native tool chain begins execution when the language compiler has finished compilation of a Windows Store app.

Sugerencia

Dado que la entrada a .NET Native es el IL y los metadatos que se escriben en los ensamblados administrados, puede generar código personalizado u otras operaciones personalizadas mediante eventos anteriores o posteriores a la compilación o modificando el archivo de proyecto de MSBuild.Because the input to .NET Native is the IL and metadata written to managed assemblies, you can still perform custom code generation or other custom operations by using pre-build or post-build events or by modifying the MSBuild project file.

Sin embargo, no se admiten las categorías de herramientas que modifican el IL y que evitan que la cadena de herramientas de .NET analice una aplicación.However, categories of tools that modify IL and thereby prevent the .NET tool chain from analyzing an app's IL are not supported. Los ofuscadores son las herramientas más importantes de este tipo.Obfuscators are the most notable tools of this type.

En el proceso de convertir una aplicación de IL a código nativo, la cadena de herramientas de .NET Native realiza operaciones como la siguiente:In the course of converting an app from IL to native code, the .NET Native tool chain performs operations like the following:

  • En determinadas rutas de código, reemplaza el código que se basa en la reflexión y los metadatos por código nativo estático.For certain code paths, it replaces code that relies on reflection and metadata with static native code. Por ejemplo, si un tipo de valor no reemplaza el método ValueType.Equals, la prueba predeterminada de igualdad usa la reflexión para recuperar objetos FieldInfo que representan los campos del tipo de valor y, a continuación, compara los valores de campo de dos instancias.For example, if a value type does not override the ValueType.Equals method, the default test for equality uses reflection to retrieve FieldInfo objects that represent the value type's fields, then compares the field values of two instances. Cuando se compila en código nativo, la cadena de herramientas de .NET Native reemplaza el código de reflexión y los metadatos por una comparación estática de los valores de campo.When compiling to native code, the .NET Native tool chain replaces the reflection code and metadata with a static comparison of the field values.

  • Siempre que puede, intenta eliminar todos los metadatos.Where possible, it attempts to eliminate all metadata.

  • En los ensamblados de la aplicación final solo incluye el código de implementación que se invoca realmente por parte de la aplicación.It includes in the final app assemblies only the implementation code that is actually invoked by the app. Esto afecta especialmente al código de bibliotecas de terceros y a la biblioteca de clases de .NET Framework.This particularly affects code in third-party libraries and in the .NET Framework Class Library. Como resultado, una aplicación ya no depende de las bibliotecas de terceros ni de la biblioteca de clases completa de .NET Framework; en su lugar, el código de bibliotecas de clases de .NET Framework y de terceros ahora es local a la aplicación.As a result, an application no longer depends on either third-party libraries or the full .NET Framework Class Library; instead, code in third-party and .NET Framework class libraries is now local to the app.

  • Reemplaza el CLR completo con un tiempo de ejecución refactorizado contiene principalmente el recolector de elementos no utilizados.It replaces the full CLR with a refactored runtime that primarily contains the garbage collector. El tiempo de ejecución refactorizado se encuentra en una biblioteca denominada mrt100_app.dll que es local a la aplicación y que solo tiene unos cientos de kilobytes de tamaño.The refactored runtime is found in a library named mrt100_app.dll that is local to the app and is only a few hundred kilobytes in size. Esto es posible porque la vinculación estática elimina la necesidad de muchos de los servicios realizados por Common Language Runtime.This is possible because static linking eliminates the need for many of the services performed by the common language runtime.

    Nota

    .NET Native usa el mismo recolector de elementos no utilizados que Common Language Runtime..NET Native uses the same garbage collector as the standard common language runtime. En el recolector de elementos no utilizados de .NET Native, la recolección en segundo plano está habilitada de forma predeterminada.In the .NET Native garbage collector, background garbage collection is enabled by default. Para obtener más información sobre la recolección de elementos no utilizados, vea Fundamentals of Garbage Collection (Conceptos básicos de la recolección de elementos no utilizados).For more information about garbage collection, see Fundamentals of Garbage Collection.

Importante

.NET Native compila una aplicación completa en una aplicación nativa..NET Native compiles an entire application to a native application. No permite compilar un único ensamblado que contiene una biblioteca de clases en código nativo, por lo que se puede llamar de forma independiente desde el código administrado.It does not allow you to compile a single assembly that contains a class library to native code so that it can be called independently from managed code.

La aplicación resultante generada por la cadena de herramientas de .NET Native se escribe en un directorio denominado ilc.out en el directorio Debug o Release del directorio del proyecto.The resulting app that is produced by the .NET Native tool chain is written to a directory named ilc.out in the Debug or Release directory of your project directory. Consta de los siguientes archivos:It consists of the following files:

  • <nombreDeAplicación> .exe, que es un ejecutable de código auxiliar que simplemente transfiere el control a una exportación Main especial en <nombreDeAplicación> .dll.<appName>.exe, a stub executable that simply transfers control to a special Main export in <appName>.dll.

  • <nombreDeAplicación> .dll, que es una biblioteca de vínculos dinámicos de Windows que contiene todo el código de la aplicación, así como el código de la biblioteca de clases de .NET Framework y de cualquier biblioteca de terceros en la que tenga una dependencia.<appName>.dll, a Windows dynamic link library that contains all your application code, as well as code from the .NET Framework Class Library and any third-party libraries that you have a dependency on. También contiene el código de soporte, como el código necesario para interactuar con Windows y para serializar objetos en la aplicación.It also contains support code, such as the code necessary to interoperate with Windows and to serialize objects in your app.

  • mrt100_app.dll, que es un runtime refactorizado que proporciona servicios de runtime como la recolección de elementos no utilizados.mrt100_app.dll, a refactored runtime that provides runtime services such as garbage collection.

Todas las dependencias se capturan el manifiesto de la aplicación APPX.All dependencies are captured by the app's APPX manifest. Además de las aplicaciones exe, dll y mrt100_app.dll, empaquetadas directamente en el APPX, se incluyen dos archivos más:In addition to the application exe, dll, and mrt100_app.dll, which are bundled directly in the appx package, this includes two more files:

  • msvcr140_app.dll, que es la biblioteca de tiempo de ejecución de C (CRT) usada por mrt100_app.dll.msvcr140_app.dll, the C run-time (CRT) library used by mrt100_app.dll. Se incluye mediante una referencia de marco en el paquete.It is included by a framework reference in the package.

  • mrt100.dll.mrt100.dll. Esta biblioteca incluye funciones que pueden mejorar el rendimiento de mrt100_app.dll, aunque su ausencia no impide el funcionamiento de mrt100_app.dll.This library includes functions that can improve the performance of mrt100_app.dll, although its absence does not prevent mrt100_app.dll from functioning. Si está presente, se carga desde el directorio system32 en el equipo local.It is loaded from the system32 directory on the local machine, if it is present.

Dado que la cadena de herramientas de .NET Native vincula el código de implementación en la aplicación, pero solo cuando sabe que su aplicación es la que invoca en realidad ese código, es posible que los metadatos o el código de implementación que son necesarios en los escenarios siguientes no se incluyan con la aplicación:Because the .NET Native tool chain links implementation code into your app only if it knows that your app actually invokes that code, either the metadata or the implementation code required in the following scenarios may not be included with your app:

  • Reflexión.Reflection.

  • Invocación dinámica o en tiempo de ejecución.Dynamic or late-bound invocation.

  • Serialización y deserialización.Serialization and deserialization.

  • Interoperabilidad COM.COM interop.

Si el código de implementación o los metadatos necesarios no están presentes en runtime, el runtime de .NET Native genera una excepción.If the necessary metadata or implementation code is absent at runtime, the .NET Native runtime throws an exception. Para evitar estas excepciones y asegurarse de que la cadena de herramientas de .NET Native incluye el código de implementación y los metadatos necesarios, use un archivo de directivas en tiempo de ejecución, que es un archivo XML que designa los elementos del programa cuyo código de implementación o metadatos deben estar disponibles en tiempo de ejecución y les asigna una directiva en tiempo de ejecución.You can prevent these exceptions, and ensure that the .NET Native tool chain includes the required metadata and implementation code, by using a runtime directives file, an XML file that designates the program elements whose metadata or implementation code must be available at runtime and assigns a runtime policy to them. A continuación se incluye el archivo de directivas de runtime predeterminado que se agrega a un proyecto de la Tienda Windows compilado por la cadena de herramientas de .NET Native:The following is the default runtime directives file that is added to a Windows Store project that is compiled by the .NET Native tool chain:

<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
  <Application>
    <Assembly Name="*Application*" Dynamic="Required All" />
  </Application>
</Directives>

Esto habilita la reflexión y la invocación dinámica en todos los tipos, así como sus miembros, de todos los ensamblados del paquete de aplicación.This enables all the types, as well as all their members, in all the assemblies in your app package for reflection and dynamic invocation. Sin embargo, no habilita la reflexión ni la activación dinámica de tipos en ensamblados de biblioteca de clases de .NET Framework.However, it does not enable reflection or dynamic activation of types in .NET Framework Class Library assemblies. En muchos casos, esto es suficiente.In many cases, this is adequate.

.NET Native y NGEN.NET Native and NGEN

El generador de imágenes nativas (NGEN) compila los ensamblados en código nativo y los instala en la caché de imágenes nativas del equipo local.The (Native Image Generator (NGEN) compiles assemblies to native code and installs them in the native image cache on the local computer. Sin embargo, a pesar de que NGEN (al igual que .NET Native) genera código nativo, se diferencia de .NET Native en algunos aspectos importantes:However, although NGEN, like .NET Native, produces native code, it differs from .NET Native in some significant ways:

  • Si no hay ninguna imagen nativa disponible para un método concreto, NGEN recurre a aplicar JIT al código.If no native image is available for a particular method, NGEN falls back to JITing code. Esto significa que las imágenes nativas deben seguir incluyendo metadatos e IL en caso de que NGEN deba recurrir a la compilación JIT.This means that native images must continue to include metadata and IL in the event that NGEN needs to fall back to JIT compilation. En cambio, .NET Native solo genera imágenes nativas y no recurre a la compilación JIT.In contrast, .NET Native produces only native images and does not fall back to JIT compilation. Como resultado, tan solo deben conservarse los metadatos necesarios para algunos escenarios de interoperabilidad, serialización y reflexión.As a result, only metadata required for some reflection, serialization, and interop scenarios must be preserved.

  • NGEN sigue confiando en Common Language Runtime para servicios como la carga de ensamblados, la comunicación remota, la interoperabilidad, la administración de memoria, la recolección de elementos no utilizados y, si es necesario, la compilación JIT.NGEN continues to rely on the full common language runtime for services such as assembly loading, remoting, interop, memory management, garbage collection, and, if necessary, JIT compilation. En .NET Native, muchos de estos servicios son innecesarios (la compilación JIT) o se resuelve en tiempo de compilación y se incorporan en el ensamblado de la aplicación.In .NET Native, many of these services are either unnecessary (JIT compilation) or are resolved at build-time and incorporated in the app assembly. El resto de servicios, de los cuales el más importante es la recolección de elementos no utilizados, se incluyen en un runtime refactorizado mucho más pequeño denominado mrt100_app.dll.The remaining services, the most important of which is garbage collection, are included in a much smaller, refactored runtime named mrt100_app.dll.

  • Las imágenes NGEN suelen ser frágiles.NGEN images tend to be fragile. Por ejemplo, si se producen una revisión o un cambio en una dependencia, es necesario aplicar de nuevo NGEN en los ensamblados que la usan.For example, a patch or change to a dependency typically requires that the assemblies that use it also be re-NGENed. Esto es particularmente cierto con los ensamblados del sistema de la biblioteca de clases de .NET Framework.This is particularly true of system assemblies in the .NET Framework Class Library. En cambio, .NET Native permite que las aplicaciones se sirvan de forma independiente.In contrast, .NET Native allows applications to be served independently of one another.

Vea tambiénSee also