¿Cómo compilar una aplicación .NET en código nativo?

89

Si quiero ejecutar una aplicación .NET en una máquina donde el marco .NET no está disponible; ¿Hay alguna forma de compilar la aplicación en código nativo?

Niyaz
fuente

Respuestas:

45

Microsoft tiene un artículo que describe cómo compilar MSIL en código nativo

Puede utilizar Ngen .

Native Image Generator (Ngen.exe) es una herramienta que mejora el rendimiento de las aplicaciones administradas. Ngen.exe crea imágenes nativas, que son archivos que contienen código de máquina compilado específico del procesador, y las instala en el caché de imágenes nativas en la computadora local. El tiempo de ejecución puede usar imágenes nativas de la caché en lugar de usar el compilador Just-In-Time (JIT) para compilar el ensamblado original.

Desafortunadamente, todavía necesita las bibliotecas del marco para ejecutar su programa. No hay ninguna característica que yo conozca del SDK de MS .Net Framework que le permita compilar todos los archivos necesarios en un solo ejecutable

Espo
fuente
1
No encuentro ninguna otra razón para usar esto además de las actuaciones. El código CLR aún se puede leer como antes y aún necesita .NET. Es tan decepcionante que Microsoft no proporcionó una herramienta que solucionara lo que considero un gran problema (cualquiera puede ver su código de alto nivel tal como está)
MasterMastic
No estoy de acuerdo con Espo. Porque, el texto en gris dice "Runtime", lo que significa CLR y, por lo tanto, .NET Framework que entra en escena como correctamente lo señaló Chris. Sin embargo, el punto NGen es cierto. La pregunta es, sin usar CLR / Runtime / .NET Framework, todos son iguales.
Jasmine
1
Sin embargo, es hora de emocionarse, parece que el marco .net finalmente está obteniendo un compilador nativo - msdn.microsoft.com/en-US/vstudio/dotnetnative
ferventcoder
ILMerge tu ejecutable .NET y todo en su árbol de dependencias y luego Ngen si quieres un ejecutable independiente de .NET .
24

RemoteSoft crea una herramienta que compila una aplicación .NET en un paquete que se puede ejecutar sin .NET instalado. No tengo ninguna experiencia con eso:

Salamandra RemoteSoft

Simon Steele
fuente
5
Esa es la única herramienta de la que he oído hablar que lo hará sin necesidad del marco. Por supuesto, cuesta $ 1249.
Slapout
3
Intenté un par de veces durante los últimos años, para obtener información o evaluación, pero nunca devuelven mis correos electrónicos sobre precios o demostraciones, así que creo que su producto puede ser un poco sospechoso.
codenheim
21

Como se han mencionado algunas de las otras respuestas aquí, puede usar la herramienta .NET Native para compilar su aplicación en código de máquina nativo. Sin embargo, a diferencia de esas respuestas, explicaré cómo hacerlo.

Pasos:

  1. Instale la herramienta dotnet CLI (interfaz de línea de comandos), que forma parte de la nueva cadena de herramientas de .NET Core. Usaremos esto para compilar nuestra aplicación; puedes encontrar un buen artículo al respecto aquí.

  2. Abra un indicador de shell y cdal directorio de su aplicación.

  3. Escribe esto:

    dotnet compile --native
    

¡Eso es! Cuando haya terminado, su aplicación se compilará en un solo binario, como este:

EXE de .NET Core compilado nativo

Será un ejecutable independiente; no se incluyen PDB, ensamblajes ni archivos de configuración (¡hurra!).


Alternativamente, si desea un programa aún más rápido, puede ejecutar esto:

dotnet compile --native --cpp

Eso optimizará su programa utilizando el generador de código C ++ (a diferencia de RyuJIT), por lo que su aplicación está aún más optimizada para escenarios AOT.

Puede encontrar más información sobre esto en el repositorio de GitHub de la CLI de dotnet .

James Ko
fuente
Nota: esto solo es compatible con proyectos creados con .NET Core. (+1, aunque)
Mahmoud Al-Qudsi
Olvidó el detalle muy importante de que .NET Native requiere Windows 10.
Elmue
parece que no funciona con .net core 3.1 alguna actualización?
user1005462
19

He probado varios de ellos y en este momento el único que admite .NET 3.5 y que también tiene una gran pila de virtualización es Xenocode Postbuild

Con ngen aún necesita tener instalado .NET framework, pero al usar una herramienta como tal, todo su código administrado se compila en código nativo para que pueda implementarlo en máquinas sin la presencia del framework.

Erick Sgarbi
fuente
11

Sí, usando Ngen , el generador de imágenes nativas. Sin embargo, hay una serie de cosas que debe tener en cuenta:

  • Aún necesita CLR para ejecutar su ejecutable.
  • El CLR no optimizará dinámicamente sus ensamblados en función del entorno en el que se ejecuta (por ejemplo, 486 frente a 586 frente a 686, etc.)

Con todo, solo vale la pena usar Ngen si necesita reducir el tiempo de inicio de su aplicación.

Chris Zwiryk
fuente
9

¡Usted puede! Sin embargo, está restringido a .NET 1.1 (no genéricos para usted): compilación Mono Ahead-Of-Time (AOT)

Sin embargo, esto significa que la compilación es realmente nativa, por lo que ya no podrá implementar un solo ensamblaje de código de bytes, necesitará uno por plataforma.

Originalmente fue diseñado porque no hay .NET o Mono para iPhone, así es como hicieron MonoTouch.

Camilo Martín
fuente
6

Puede hacer esto utilizando la nueva tecnología de precompilación llamada .NET Native. Compruébelo aquí: http://msdn.microsoft.com/en-US/vstudio/dotnetnative

Actualmente solo está disponible para aplicaciones de la Tienda Windows. Realiza la vinculación de un solo componente. Entonces, las bibliotecas de .NET Framework están vinculadas estáticamente a su aplicación. Todo se compila de forma nativa y los ensamblados de IL ya no se implementan. Las aplicaciones no se ejecutan en CLR, sino en un tiempo de ejecución optimizado y simplificado llamado Managed Runtime (Mrt.dll)

Como se indicó anteriormente, NGEN utilizó un modelo de compilación mixto y se basó en IL y JIT para escenarios dinámicos. .NET Native no utiliza JIT, pero admite varios escenarios dinámicos. Los autores de código necesitarían utilizar Directivas en tiempo de ejecución para proporcionar sugerencias al compilador nativo de .NET sobre los escenarios dinámicos que desean admitir.

m_eric
fuente
1
+1 - Llevo años esperando que esto suceda. Esperaba que el encaprichamiento del mundo con la "Máquina virtual" se ejecutara antes, pero no obstante, está sucediendo. Espero que estemos a punto de ver un resurgimiento de la compilación nativa. Como dijiste, es para las aplicaciones de la tienda de Windows en este momento, pero es solo cuestión de tiempo antes de que el mercado de computadoras de escritorio exija un trato igualitario.
codenheim
4

Puede usar ngen.exe para generar una imagen nativa pero aún debe distribuir el código original no nativo también, y aún necesita el marco instalado en la máquina de destino.

Lo que no resuelve tu problema, de verdad.

Matt Bishop
fuente
2

Respuesta de 2019: use dotnet / corert . Puede compilar proyectos .NET Core en .exearchivos independientes . Sin dependencias (excepto para bibliotecas del sistema como kernel32.dll). Apuesto a que esto es exactamente lo que necesita el OP.

Desde su página de inicio de GitHub:

El compilador de CoreRT puede compilar una aplicación .NET Core administrada en un ejecutable de archivo único nativo (específico de la arquitectura) que es fácil de implementar. También puede producir bibliotecas dinámicas o estáticas independientes que pueden ser consumidas por aplicaciones escritas en otros lenguajes de programación.

brk
fuente
1

La naturaleza de .NET es poder instalar aplicaciones que se han compilado en MSIL, luego, ya sea por JIT o Ngen, MSIL se compila en código nativo y se almacena localmente en un caché. Nunca tuvo la intención de generar un verdadero .exe nativo que se pueda ejecutar independientemente del marco .NET.

Tal vez haya algún truco que haga esto, pero no me parece seguro. Hay demasiadas dinámicas que requieren el marco, como: carga dinámica de ensamblajes, generación de código MSIL, etc.

Spoulson
fuente
0

La razón principal para compilar en Native es proteger sus códigos; de lo contrario, el MSIL compilado es como implementar los códigos fuente en la máquina del cliente.

NGEN se compila en nativos pero también necesita implementar códigos IL, este propósito es solo para reducir el tiempo de inicio, pero también es inútil.

CoreRt es la versión alfa y funciona solo con aplicaciones simples de tipo helloworld.

.Net Core se compila en archivos ejecutables individuales pero tampoco es un exe nativo, esto es solo un archivo comprimido de códigos IL y descomprimirá los códigos en la carpeta temporal mientras se ejecuta.

Mi pregunta simple de Microsoft es, si RyuJIT puede compilar IL en nativo sobre la marcha, ¿por qué no puede compilar el mismo IL antes de tiempo (AOT)?

Rahim Surani
fuente
"CoreRt es una versión alfa y solo funciona con aplicaciones simples de tipo helloworld". Esto no es cierto: hay juegos en Steam (por ejemplo, street4rage.com ) que son más complejos que helloworld.
S Waye
Pero CoreRT no puede compilar ninguna aplicación Winform. Encontré otro compilador en línea que puede compilar la aplicación Winform ( dotnetnative.online )
Rahim Surani
-1

intente esto ( http://www.dotnetnative.online/ ) para compilar .net compilado exe en exe nativo, probé esto, es nuevo pero bueno.

Rahim Surani
fuente
Publique el contenido del enlace en la respuesta.
Russ J
-3

Creo que no es posible. También necesitará distribuir .NET FW. Si desea compilar la aplicación .NET en código nativo, use la herramienta NGen

aku
fuente