{"id":685,"date":"2012-08-20T11:19:54","date_gmt":"2012-08-20T17:19:54","guid":{"rendered":"http:\/\/www.lastdragon.net\/?p=685"},"modified":"2015-01-26T18:43:07","modified_gmt":"2015-01-27T00:43:07","slug":"compilando-aplicaciones-c-net-a-codigo-maquina-nativa","status":"publish","type":"post","link":"https:\/\/www.lastdragon.net\/?p=685","title":{"rendered":"Compilando aplicaciones C# .NET a c\u00f3digo maquina nativa"},"content":{"rendered":"<p>Cada dia me termina de convencer mas .NET y C# pero no por Microsoft, sino por Miguel de Icaza <\/p>\n<p>Si bien es cierto que C# naci\u00f3 de las rencillas de Microsoft vs Sun por Java, tambi\u00e9n es cierto que el que ha hecho lo mejor con este modelo de programaci\u00f3n ha sido Miguel, el .NET como Java son sistemas de compilaci\u00f3n a pseudo c\u00f3digo o c\u00f3digo de una maquina virtual, en este estado de bytecode es un tipo de compilaci\u00f3n a medias, se puede terminar la compilaci\u00f3n a m\u00e1quina interpret\u00e1ndola 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\u00f3n lo que hace que la primera carga del c\u00f3digo sea lenta y es por este motivo que Java es conocido por su lentitud.<\/p>\n<p>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\u00f3digo nativo con las funciones AOT.<\/p>\n<p>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\u00e1s 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.<\/p>\n<p>En el caso de MONO hay una caracter\u00edstica 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\u00edas .NET necesarias que requerir\u00e1 el programa, despu\u00e9s se le inyecta programa bytecode .NET  y finalmente un cargador en c\u00f3digo nativo el cual es compilado a c\u00f3digo 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.<\/p>\n<p>Para finalmente entender c\u00f3mo funciona el empaquetado o bundle, puedes imaginarte a este bundle como un ZIP auto extra\u00edble. El winzip extrae los archivos ZIP, pero si haces un ZIP autoextra\u00edble 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<\/p>\n<p>Es lo mas cercado a compilaci\u00f3n 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\u00f3n por hacer todo este encapsulamiento es que el binario resultante suele de ser de varios megas.<\/p>\n<p>Hace muchos a\u00f1os quer\u00eda que Java tuviera algo asi, es una pena, aunque ahora .NET al menos Mono puede hacer esto, la belleza de la programaci\u00f3n 100% orientada a objetos con portabilidad binaria y ahora incluso redistribuci\u00f3n nativa a la plataforma seleccionada.<\/p>\n<p>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\u00f3n .NET C# , VB.NET y cualquier cosa .NET funcionara sin mayor problema en Windows Vista, 7 y en Windows 8<\/p>\n<p>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\u00ednea se puede poner las variables a 32 bits, para realizar el bundle<\/p>\n<p>CC=&#8221;cc -arch i386&#8243; AS=&#8221;as -arch i386&#8243; mkbundle programaaempaquetar.exe -o programaosXnatvo  &#8211;deps \u2013z<\/p>\n<p>No importa que el paquete o bundle sea a 32 bits, aun as\u00ed se ejecutara porque incluso el OSX tiene retro compatibilidad con programas anteriores a su ultimas versiones.<\/p>\n<p>En Linux <\/p>\n<p>mkbundle \u2013static programaaempaquetar.exe \u2013o paquetenativo &#8211;deps   <\/p>\n<p>En el siguiente video escrib\u00ed 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.<\/p>\n<p>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.<\/p>\n<p><iframe loading=\"lazy\" width=\"420\" height=\"315\" src=\"\/\/www.youtube.com\/embed\/Z-t5gZMLHyc\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>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\u00f3 de las rencillas de Microsoft vs Sun por Java, tambi\u00e9n es cierto que el que ha hecho lo mejor con este modelo de programaci\u00f3n ha sido Miguel, el .NET&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-685","post","type-post","status-publish","format-standard","hentry","category-programacion"],"_links":{"self":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/685","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=685"}],"version-history":[{"count":1,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/685\/revisions"}],"predecessor-version":[{"id":1254,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/685\/revisions\/1254"}],"wp:attachment":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=685"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=685"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=685"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}