Compilando aplicaciones C# .NET a código maquina nativa
By: Date: agosto 20, 2012 Categories: Programación

Cada dia me termina de convencer mas .NET y C# pero no por Microsoft, sino por Miguel de Icaza

Si bien es cierto que C# nació de las rencillas de Microsoft vs Sun por Java, también es cierto que el que ha hecho lo mejor con este modelo de programación ha sido Miguel, el .NET como Java son sistemas de compilación a pseudo código o código de una maquina virtual, en este estado de bytecode es un tipo de compilación a medias, se puede terminar la compilación a máquina interpretándola en el equipo final, por ejemplo en un Linux , en un Windows, MacBook, incluso mobiles. El problema con esto es que eso se hace mayormente en tiempo de ejecución lo que hace que la primera carga del código sea lenta y es por este motivo que Java es conocido por su lentitud.

Sin embargo usando desarrollo alterno al de Microsoft, en lugar de usar el FrameWork de .NET se puede usar el de MONO tanto en Windows como en otras arquitecturas, mono tiene la capacidad de precompilar todo para tener la agilidad de código nativo con las funciones AOT.

Aunque con las funciones AOT se gana velocidad en los .NET usando MONO, el .NET como Java no es parte del sistema operativo, excepto en Windows, pero todos los demás OS no lo incluyen de forma nativa y el binario compilado a .NET no se ejecutara si no esta presente el framework de MONO o el de .NET de Microsoft.

En el caso de MONO hay una característica interesante que no he visto en el mundo de Windows, hacer un empaquetado o bundle, lo que el bundle hace es muy simple, mete el interprete, las librerías .NET necesarias que requerirá el programa, después se le inyecta programa bytecode .NET y finalmente un cargador en código nativo el cual es compilado a código maquina encapsula todo. Esto da por resultado un programa .NET que incluye todo lo necesario para ejecutarse incluso donde no hay instalado un framework .NET sea MONO o Microsoft.

Para finalmente entender cómo funciona el empaquetado o bundle, puedes imaginarte a este bundle como un ZIP auto extraíble. El winzip extrae los archivos ZIP, pero si haces un ZIP autoextraíble en lugar de terminar con el archivo .ZIP terminas con un .EXE que al ejecutarlo de su interior saca el ZIP y no requieres tener instalado el Winzip

Es lo mas cercado a compilación nativa ya que el programa se puede redistribuir sin tener que solicitarle a usuario final que descargue el MONO o el Framework.NET aunque la penalización por hacer todo este encapsulamiento es que el binario resultante suele de ser de varios megas.

Hace muchos años quería que Java tuviera algo asi, es una pena, aunque ahora .NET al menos Mono puede hacer esto, la belleza de la programación 100% orientada a objetos con portabilidad binaria y ahora incluso redistribución nativa a la plataforma seleccionada.

Los bundle funcionan en la MAC, en Linux, en los Smartphone con IOS o Android, en Windows esto no es necesario puesto que desde el Vista el framework .NET esta integrado en el OS, asi que se da por hecho que cualquier solución .NET C# , VB.NET y cualquier cosa .NET funcionara sin mayor problema en Windows Vista, 7 y en Windows 8

En la OSX de la Macbook el bundle solo se puede crear a 32 bits, esto es un problema porque en Lion y un par de anteriores versiones son ya de 64 bits, sin embargo usando la siguiente línea se puede poner las variables a 32 bits, para realizar el bundle

CC=”cc -arch i386″ AS=”as -arch i386″ mkbundle programaaempaquetar.exe -o programaosXnatvo –deps –z

No importa que el paquete o bundle sea a 32 bits, aun así se ejecutara porque incluso el OSX tiene retro compatibilidad con programas anteriores a su ultimas versiones.

En Linux

mkbundle –static programaaempaquetar.exe –o paquetenativo –deps

En el siguiente video escribí un programa que abre el puerto 5000 tcp y espera conexiones via multihilos, todo lo que escucha por la red lo escribe en la consola.

Primero lo compilo a bytecode y lo ejecuto como bytecode usando mono, finalmente le hago en bundle y ejecuto el programa nativo de Linux que ya no requiere tener el framework .net de mono y lo podria redistribuir a cualquier otra distro de Linux.

5 thoughts on “Compilando aplicaciones C# .NET a código maquina nativa

  1. Safari 7534.48.3 iOS 5.1.1

    Excelente post LastDragon hace poco vi algo similar en un CentOS; en esa ocasión el programa crasheo gacho y ahora que lo mencionas pudo ser que la prueba la ejecutaron en 64 bits.

    Saludos.

  2. Google Chrome 21.0.1180.83 Windows 7

    Antes que nada disculpa que te contacte por aqui, y peor con un offtopic, pero me parece que es rapido y eficaz, ahi lo borras lo cuando lo leas.

    Que piensas sobre esto:
    “Proveedor de internet canadiense se auto-inserta en google”
    wired.com/threatlevel/2007/12/canadian-isps-p

    es noticia vieja, pero me acaba de pasar algo similar, mi proveedor inserto un recuadro anunciando una pizzeria en youtube y luego me salio en un foro gringo .

    Les marque para confirmar, y me dijeron que sin lugar a dudas , fueron ellos , y que lo estaran haciendo una vez al mes; empese a quejarme al respecto pero “casualmete” se callo la conexion de mi telefono (tengo el “doble-play” )…

    definitivamente buscare cambiarme de compañia,
    pero el punto es, que pinesas de que los ISP hagan esto?

  3. Mozilla Firefox 14.0.1 Ubuntu Linux

    éticamente lo veo mal por que ya pagas por un servicio de internet, si fuera gratis estaria 100% en su derecho.

    eso no es nuevo, las compañias de cable aveces lo hacen igual, inyectan publicidad local en el canal de televisa bloqueando el comercial de algún otro.

    Yo lo veo mal

  4. Google Chrome 20.0.1150.0 Windows 7

    hey last, tmb a mi me gusta .NET, y lo uso, pero me dan vueltas en la cabeza las declaraciones de Stallman respecto al uso de estas tecnologías. ¡cuál es tu opinión al respecto?

    Sé que a final de cuentas el principal argumento de Stallman es ético-filosófico, pero en este caso ademas argumenta cuestiones practicas y de propagacion-bloqueo de patentes, al parecer se decantara por qué tecnologías ?…java?…que acaso no esta bajo oracle, la cual ya ha demandado a empresas por su uso no autorizado? entonces que otras alternativas podremos tener para verdadero soft multiplataforma?

  5. Internet Explorer 9.0 Windows 7

    Hac

    A veces no entiendo a Richard Stallman es una persona muy complicada.

    Tal vez Richard se refiere a que no hay que usar mono o .NET pero definitivamente apoya el concepto, como lo se….

    hosteado en el sitio oficial de GNU esta

    http://www.gnu.org/software/dotgnu/

    Si, DotGNU es la version de .NET freesoftware y si a Richard Stallman le disgusta tanto, que hace apoyando y manteniendo proyectos relacionados a esa tecnologia del “diablo”

    En mi opinion personal .NET es bueno como concepto y como tecnologia, aunque al igual que Stallman me preocupa que algun dia Microsoft nos de la espalda y se defienda con patentes.

    Tambien hay que reconocer que aun en su extremismo Richard Stallman es un profeta en el mundo de la informatica, todo lo que ha profetizado se cumplio, se esta cumpliendo y seguro se cumplira, si el ve algo mal en .NET como programadores hay que preocuparse si lo quieres implementar en algo fuera de Windows

Responder a Z3r0k3y Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *