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?
Respuestas:
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
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:
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:
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í.
Abra un indicador de shell y cd
al directorio de su aplicación.
Escribe esto:
dotnet compile --native
¡Eso es! Cuando haya terminado, su aplicación se compilará en un solo binario, como este:
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 .
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.
Microsoft ha anunciado su .NET Native Preview que permitirá ejecutar aplicaciones .NET sin tener el framework instalado.
Eche un vistazo: http://blogs.msdn.com/b/dotnet/archive/2014/04/02/announcing-net-native-preview.aspx
Preguntas frecuentes: http://msdn.microsoft.com/en-US/vstudio/dn642499.aspx
Puede descargar Microsoft .NET Native para VS2013 desde aquí: http://msdn.microsoft.com/en-US/vstudio/dotnetnative
Sí, usando Ngen , el generador de imágenes nativas. Sin embargo, hay una serie de cosas que debe tener en cuenta:
Con todo, solo vale la pena usar Ngen si necesita reducir el tiempo de inicio de su aplicación.
¡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.
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.
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.
Respuesta de 2019: use dotnet / corert . Puede compilar proyectos .NET Core en .exe
archivos 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.
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.
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)?
Parece que son soluciones funcionales de Net Core RT; pronto todas las aplicaciones pasarán a .net core; https://www.codeproject.com/Articles/5262251/Generate-Native-Executable-from-NET-Core-3-1-Proje?msg=5753507#xx5753507xx https://docs.microsoft.com/en-us / archive / msdn-magazine / 2018 / noviembre / net-core-publishing-options-with-net-core
no probado tal vez con el viejo win .net sdk posible hacer algo similar.
intente esto ( http://www.dotnetnative.online/ ) para compilar .net compilado exe en exe nativo, probé esto, es nuevo pero bueno.
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