Cómo ejecutar programas implementados en .NET en Linux con Mono

Introducción

Cuando el otro día hablábamos de cómo ejecutar un programa Windows sobre Linux con Wine, nos preguntaron por los programas que están implementados con .NET, que por cierto cada día son más en plataformas Windows.

Desde estas líneas os recuerdo que al igual que Java, .NET es una plataforma pensada para tener un carácter multiplataforma (aunque en la realidad el grado de compatibilidad es mucho menor) por lo que con una máquina virtual que soporte la ejecución de dicho programa a priori no habría problema.

¿Existe un entorno de ejecución de .NET en Linux? Sí que existe, es Software Libre y es uno de los proyectos libres que más me interesan (por suerte o por desgracia trabajo a diario con entornos .NET en mi trabajo). Hablamos del Proyecto Mono y he de deciros que es uno de los proyectos más polémicos de todo el universo libre por razones de cercanía a Microsoft.

Ejecución

Un ejecutable creado con .NET para plataformas de escritorio podemos ejecutarlo directamente desde la consola con la siguiente orden:

$ mono fichero.exe

Tendremos que tener instalado el entorno de ejecución de Mono (normalmente llamado mono-runtime si queréis buscarlo en vuestro gestor de paquetes).

Es muy posible que el instalador del programa que queremos ejecutar no esté implementado en Mono, por lo que habría que seguir dos pasos:

  1. Ejecutar el instalador con Wine
  2. Buscar la ruta dónde se ha instalado y ejecutarlo con Mono. Os doy un consejo, mirar en vuestro directorio home la carpeta “.wine”, dentro de ella “drive_c” y ahí “Archivos de programa”, al más puro estilo Windows.

En ese directorio: $HOME/.wine/drive_c tendréis una emulación del disco principal del sistema imitado por Wine.

    Author Description

    F. Javier Carazo Gil

    Casi Ingeniero Informático, co-fundador y administrador de Linux Hispano, además de desarrollar software y mantener sistemas en el CSIC, hace poco he fundado junto con Alberto Hornero una start-up: CODECTION donde trabajamos con software libre. Puedes saber más sobre mí, mi vida laboral, mis libros, mis artículos y mi día a día en @fjcarazo y en mi perfil público de LinkedIn.

    • Pingback: Tweets that mention Cómo ejecutar programas implementados en .NET en Linux con Mono | Linux Hispano -- Topsy.com()

    • http://www.muspells.net nordri

      Pues me sale este error, que estuve investigando y no conseguí entender.

      Cannot open assembly ‘Setup.exe': File does not contain a valid CIL image.

      En fin, tampoco es el fin del mundo.

      buen post!, saludos.

    • Pingback: Bitacoras.com()

    • http://www.jcarazo.com carazo

      @nordri: Como comento en el post, lo que te ocurre es que el instalador no está implementado en .NET (CIL es el nombre del pseudo-lenguaje que usa .NET/Mono, podríamos compararlo con el bytecode de Java).

      Debes ejecutar el instalador, tratar que te instale el programa (forzándolo a que no compruebe que está instalada la Framework de .NET) y luego ejecutarlo con .NET.

      Si quieres engañarlo puedes tratar de extraer del instalador con tar u otro compresor, el programa en sí y ejecutarlo posteriormente con Mono como comento en este artículo.

      Ya me contarás cómo te va.

    • http://www.muspells.net nordri

      Bien, efectivamente el instalador no era un programa .NET, y con el último Wine se ha ejecutado y ha instalado el software. De echo, esto me decía “file”
      nordri@nordri-desktop:~$ file sandbox/Setup.exe
      sandbox/Setup.exe: PE32 executable for MS Windows (GUI) Intel 80386 32-bit

      Bueno, se ha instalado, eso ha mejorado con respecto a la última vez que lo probé con Wine, pero “mono” no lo lanza, te pego aquí lo que me dice:

      http://pastebin.com/PQEdW5Kc

      Un saludo

    • http://www.jcarazo.com carazo

      @nordri: Por lo que veo en el pastebin, te faltan los ensamblados de Visual Basic a los que hace referencia el programa de Hoffman.

      Lo más fácil es que pruebes a instalar un paquete que en los repositorios de Ubuntu 10.04 se llama: libmono-microsoft-visualbasic, si no lo encuentras busca: “Visual Basic 2005 runtime libraries for Mono”.

      Con eso creo que lo tendrás solucionado, porque automáticamente el paquete te lo mete en el GAC que es por así decirlo el coordinador del repositorio de ensamblados del sistema Mono/.NET.

    • http://www.muspells.net nordri

      Instalé el soporte para VB como me has comentado y llego a este error
      nordri@nordri-desktop:~$ mono .wine/drive_c/Archivos\ de\ programa/Hofmann/Hofmann/program/Hofmann.exe
      ** Message: Unknown heap type: CLR

      Unhandled Exception: System.TypeInitializationException: An exception was thrown by the type initializer for —> System.InvalidProgramException: Invalid IL code in A.c371aab3e1f40fe2ebcd6dcee95f7d0e1:c5f10bc2014e3a32b10cc0f5e08c0bff9 (): IL_0002: stloc.0

      at ..cctor () [0x00000]
      — End of inner exception stack trace —

      Según he leido el soporte de VB es bastante reciente, así que espero que en próximas releases funcione.

      Muchas gracias
      Saludos

    • http://www.jcarazo.com carazo

      @nordri: Esperemos que versiones futuras arreglen el problema. Me alegro al menos de que hayas investigado algo por Mono para ver que muchas aplicaciones de .NET pueden ejecutarse sin problemas en Linux.

      ¡Un saludo!

    • Pingback: Cómo ejecutar programas implementados en .NET en Linux y Mac OS con Mono()

    • Pingback: Meneame: Cómo ejecutar programas implementados en .NET en Linux y Mac OS con Mono | Superlinux()

    • Diego

      Hola por favor ayudame manda tu respuest alo correo lo que pasa que mi aplicacion echa en vs2010 con c# no coje con el wine no se que hacer ya tengo instalado el mono y nada que lo abre el proyecto dice que falta asembladores

    • http://www.jcarazo.com F. Javier Carazo Gil

      @Diego: tienes que buscar los ensamblados que te faltan. Para ello búscalos primero, luego los referencias con el GAC y finalmente los ejecutas con Mono.

    • Linuxero novato

      Hola gracias, tu pagina me ayudo a arrancar un programa, pero hay algo que no comprendo. Tengo el codigo fuente  de un programa .NET, lo compilo con make, luego lo instalo con make install y va a /usr/local/share/programax. Si en terminal voy a ese directorio y ejecuto mono programax si funciona. Pero si en el sistema de ficheros en modo grafico, le digo ejecutar con mono runtime (desde terminal o no es indiferentel), entonces parece que intenta arrancar pero la ventana se cierra al poco tiempo. No consigo entender por que pasa, llevo poco tiempo con linux

    • Pingback: Semana de enlaces #32 2010 | Ubuntizando.com()