2009-11-22 21 views
19

Hay un programa escrito completamente en C# que apunta a .NET Framework 2.0. ¿Hay alguna manera de que yo pueda de alguna manera compilar (traducir) EXE administrado a uno nativo para que pueda ser .NET-agnóstico? Sé que probablemente haya productos comerciales para ese fin ... pero son un poco caros.Conversión de la aplicación .NET al código nativo x86

El problema es que debemos implementar el programa en computadoras con Windows XP sin .NET Framework instalado. También es necesario que el tamaño del programa no supere los 500 Kb (1 Mb máximo) para que se descargue desde el servidor web (ahora el tamaño es de 255 Kb). Es por eso que no hay forma de que podamos conectar un .NET FX completo (o incluso uno reducido) al archivo del programa descargado.

Obviamente, es un terrible error de ingeniería de software que debería haberse detectado y evitado antes, por lo que podríamos usar tecnologías nativas como C++ en su lugar.

Hemos intentado por ahora Mono de Novell: una implementación de código abierto para .NET Framework para Linux, MAC y Windows. Mono consta de compiladores de C#, IDE, runtime (CLR) y ensamblajes de Class Library (como System.dll y mscorlib.dll, muy parecidos a los ensamblados de biblioteca de clases de .NET instalados en GAC). Lo que tratamos de hacer es ubicar los archivos CLR y enviarlos junto con el archivo de nuestro programa y algunas asambleas. De esta forma, el programa se puede invocar ejecutando "mono program.exe" (símbolo del sistema) en la computadora de un usuario. Además de la inconveniencia de tal uso para el usuario final, los archivos CLR (mono.exe y mono.dll) resultaron ser de aproximadamente 2.5 Mb en total, que es mucho mayor que los 500 Kb o incluso 1 Mb deseados.

Por lo tanto, hemos dejado sin otra opción que la de traducir nuestra aplicación .NET a un nativo por un compilador, sin embargo, la pregunta sigue siendo - lo compilador debemos utilizar y dónde podría encontrar uno que ...

Por el momento, me he topado con un proyecto de Singularity OS de Microsoft Research. Es un sistema operativo de investigación de código abierto que está escrito en código administrado (al menos en parte). El sistema operativo Singularity incluye un compilador de Bartok que el sistema operativo usa para traducir un programa administrado a uno nativo (x86 de 32 bits). Cabe señalar que Bartok no puede traducir todos los aspectos de .NET 2.0 a un código nativo, pero la mayoría de ellos. Sin embargo, todavía no he aprendido a usar Singularity ...

Le agradecería mucho si pudiera proporcionarme algunos consejos útiles sobre el problema, su propia experiencia con Singularity OS y Bartok Compiler u otro acercamiento al problema que he pasado por alto y formas de resolverlo.

¡Muchas gracias de antemano!

Finalmente, utilizando la función completa de AOT de Mono (siguiendo el consejo de Callum Rogers), he logrado producir un programa.exe.dll que carece de un encabezado CLI. Así que me parece una dll nativa. Sin embargo, no puedo entender cómo convertir ese dll en exe o hacerlo operativo. También este dll no parece exponer ninguna función de interés, como la función principal.

+3

les víctima: http://stackoverflow.com/questions/45702/is-there-some-way-to-compile-a-net-application-to-native- código –

+0

¿Está intentando hacer esta plataforma multiplataforma, o simplemente eliminar las dependencias de las bibliotecas de marcos? –

+0

Solo trato de eliminar las dependencias de .NET Framework para que pueda ejecutarse en Windows XP sin tener instalado .NET FX. – Vlad

Respuesta

1
No

realmente una solución para .NET a la conversión nativa, pero tal vez esto ayuda: http://www.yoda.arachsys.com/csharp/faq/#framework.required

+0

Gracias. Prestaré atención a los programas mencionados en la lista. Sin embargo, hasta donde yo sé, estos programas no son muy baratos, sin embargo, puede haber una carga útil significativa, es decir, el tamaño de nuestro ejecutable superará la cifra deseada. – Vlad

+0

el enlace parece estar muerto. –

0

No estoy seguro de que hay mucho que se pueda hacer, además de escribir la aplicación minuciosamente. Para facilitar el proceso que ya es una carga, podría desensamblar la aplicación .NET usando algo como Reflector (en Microsoft C++), y usar eso como base para comenzar y simplemente reemplazar las referencias administradas de C++ por las nativas.

+1

Espero que se encuentre una forma de evitar volver a escribir la aplicación completa en C++, ya que llevará bastante tiempo y, lo que es más importante, tiempo de depuración. – Vlad

9

Consulte la compilación AOT (Ahead Of Time) del proyecto Mono.Esto compila su proyecto administrado en un exe nativo o un ejecutable elf (según el sistema al que se dirija) que no necesita el JIT. Esta es la técnica utilizada para obtener aplicaciones mono en el iPhone (donde JIT/Framework no está permitido) y también tiene los beneficios adicionales de tiempos de inicio más rápidos, menor uso de memoria y dificulta la descompilación de su código. Dijiste que ya estabas usando Mono, por lo que debería ser compatible.

Lea sobre esto at the mono-project.com website y at Miguel de Icaza's blog (y iPhone info).

Tenga en cuenta que no se puede usar el código dinámico o interfaces genéricas como

interface IFoo<T> { 
... 
    void SomeMethod(); 
} 

Y tendrá que compilar los archivos DLL de todas las bibliotecas que utiliza.

PD: Asegúrese de utilizar "AOT" completo para su problema.

+0

Gracias por su respuesta. Parece que intenté anteriormente compilar una muestra de Hello World de esta manera, pero falló. Posiblemente porque [Total AOT] de Mono no es compatible con todos los procesadores (tengo Intel Core 2 Duo). Sin embargo, examinaré Full AOT a fondo, ya que es posible que haya hecho algo mal. – Vlad

+0

Full AOT funciona al menos para x86 y x86-64, así como para los procesadores ARM y PPC. – Gonzalo

+0

Finalmente, he logrado producir un programa.exe.dll que carece de un encabezado CLI. Parece un dll nativo Sin embargo, no puedo entender cómo convertir ese dll en exe o hacerlo operativo. Además, este dll no parece exponer ninguna función de interés, como la función principal – Vlad

3

Hay un proyecto llamado CrossNet que analiza .Net Assemblies y genera código C++ no administrado, que se puede compilar en cualquier compilador estándar.

+0

¿Analiza ensamblajes o código? Perdón por preguntar, pero el proyecto me parece confuso. –

8

2017 Actualización

Como @jenix's comment, .NET nativo es solo para Windows tienda de aplicaciones (UWP). Después de 3 años de su anuncio, esto sigue siendo cierto, .net nativo para escritorio puede ser eliminado por microsoft. Entonces esta respuesta ya no es aplicable.

Para aplicaciones de consola, puede usar .net core Self-contained deployments (SCD). Incluso para una aplicación de hello world, su paquete tendrá 50 MB +. Sin embargo, aún necesita instalar el tiempo de ejecución de VC.

========

Microsoft anunció .NET nativo Vista previa en Build 2014

con el promotor nativo .NET Vista previa, aplicaciones conseguirán desplegado en dispositivos de usuario final como totalmente código compilado nativamente autónomo, y no tendrá una dependencia en .NET Framework en el dispositivo/máquina objetivo. Por lo tanto, no se requiere .NET Framework en la máquina de destino con .NET Native.

Announcing .NET Native Preview
Microsoft .NET Native

+3

.NET Native es solo para Windows Store Apps aunque ... – Jenix

+0

@JenixGuy Sí, después de 2 años. – prime23

Cuestiones relacionadas