Programando para Windows Mobile 5 con Mono (parte 2)

Ahora que ya establecimos contacto entre la PDA y el PC podemos empezar la parte de programación.

Windows Mobile 5 incorpora una máquina virtual de .NET, por lo que, en principio, parece que podemos utilizar Mono directamente para escribir un programa, transferir el .exe directamente a la PDA y ejecutarlo. Por desgracia la cosa no es tan sencilla, pues las PDAs disponen de una versión reducida de .NET denominada .NET Compact Framework. Se trata, básicamente, de un subconjunto de la máquina virtual clásica, por lo que hay una serie de clases y métodos que no estarán disponibles. Es por esta razón que los ejecutables .NET para PDAs usan una firma digital diferente que los que son para equipos clásicos, y por eso si intentamos ejecutar en una PDA un programa hecho con Mono recibiremos un mensaje de error, indicándonos que ese fichero no es un programa válido.

Afortunadamente, Jean-Baptiste Evain publicó en su blog un programa que cambia la firma de un ejecutable .NET, de manera que ya puede correr en una máquina con Compact Framework (por supuesto, deja de ser ejecutable en un equipo clásico). Con ésto ya tenemos salvado el principal escollo, aunque hay que tener en cuenta que, para usarlo, es necesaria la versión 0.4 o posterior de CECIL, un módulo escrito y mantenido por el propio Jean-Baptiste Evain que da acceso a bajo nivel a los ficheros .exe de .NET. En Debian testing y en Ubuntu Edgy está dicha versión, pero en Ubuntu Dapper, que todavía es la versión estable de Ubuntu, está la versión 0.3. De todas maneras, si tenemos en cuenta que Edgy saldrá el próximo día 10, no es una espera demasiado larga.

Para usar este programa tan sólo tenemos que compilarlo con Mono y luego llamarlo desde la línea de comandos, poniendo como primer parámetro el fichero .exe que queremos convertir.

Ahora que ya podemos meter código ejecutable en nuestra PDA debemos saber que hay algunas diferencias a la hora de programar para ésta, las cuales vienen dadas por la diferente naturaleza del dispositivo (sin teclado, poca memoria, sin ventanas que se solapan…). Veamos algunas de ellas.

Para empezar está el tema de ventanas y widgets. Para trabajar con ellas usaremos las WinForms, pero teniendo en cuenta que algunos widgets (como, por ejemplo, RichTextForm) no estarán disponibles. En esta página de microsoft (en castellano, además) hay una excelente relación de las diferencias entre .NET Framework y .NET Compact Framework.

Existen, sin embargo, un par de detalles extra que me gustaría comentar. Para empezar, por defecto no aparece el botón para desplegar el teclado virtual. Para disponer de él tenemos que añadir a nuestro Form un menú, de la siguiente manera:

MiForm.Menu = new MainMenu();

(siendo MiForm el objeto formulario al que le queremos añadir el menú y el teclado). En esta página podemos encontrar más detalles sobre el teclado virtual. OJO: aunque en ella dice que dicho menú se añade automáticamente, ésto sólo es cierto cuando trabajamos con Visual Studio, no con Mono.

La segunda cuestión se refiere al botón de la ventana con forma de X. La primera impresión que da es que dicho botón destruye el Form; sin embargo, lo que hace realmente es minimizarlo. Tal y como se explica en esta página de Microsoft sobre el botón de los formularios, para que el botón destruya el Form es necesario hacer lo siguiente:

MiForm.ControlBox = True
MiForm.MinimizeBox = False

aunque, en las pruebas que hice, parece que basta con poner a False la propiedad MinimizeBox únicamente, sin tocar ControlBox. Por último, si ponemos ambas a False el Form no tendrá ningún botón.

Un detalle importante es que cuando cerramos el último formulario la aplicación se cierra. En la plataforma clásica, sin embargo, al cerrar un formulario simplemente se retorna de Application.Run(formulario). Esto lo descubrí de casualidad, porque, en la aplicación que estoy haciendo, necesito cambiar por completo los widgets del formulario en función de las acciones del usuario. Al principio destruía el formulario actual (llamando a su método close()) y creaba uno nuevo, pero si bien funcionaba en la plataforma clásica, no lo hacía en la PDA. La solución en este caso fue llamar al método Clear() del formulario, que elimina todos los widgets de éste y lo deja listo para ser repoblado con nuevos elementos.

Comentar también que si la PDA nos devuelve un error indicando que necesitamos una versión posterior de .NET para ejecutar dicho programa, significa que hemos usado alguna clase o método no soportado en el Compact Framework. Al pulsar en OK podremos ver el error completo, y en concreto qué método o clase es la que provocó el error. Si nos ocurre ésto tendremos que buscar la manera de sustituir dicha clase o método por otro que sí esté soportado.

Esto es todo lo que llevo descubierto hasta ahora. A medida que encuentre nuevas cosas interesantes las iré poniendo por aquí.

Por último, añadir dos URLs con información extra (en inglés) sobre el .NET Compact Framework.

Building applications for platforms and components

Product information for .NET Compact Framework

9 Responses to “Programando para Windows Mobile 5 con Mono (parte 2)”

  1. meneame.net Says:

    Programando para Windows Mobile 5 con Mono…

    Los que hayan intentado escribir un programa con Mono para su PDA con Windows Mobile 5 se habrán encontrado con que ésta se queja y no lo ejecuta. En este pequeño artículo explico como conseguir que funcione, así como detalles importantes (como a…

  2. technobicho Says:

    Es interesante tu articulo, y creo que eres la persona que me puede resolver mi duda, quiero programar en mi PDA una hx4700 con WM5, una aplicación con la cual pueda visualizar mapas e interactuar con un GPS mediante Bluetooth, pero quiero hacerlo en Linux, la pregunta es: Existen las herramientas?, si es así cual seria la mejor.
    Gracias.

  3. raster Says:

    Me temo que no puedo ayudarte en eso. Supongo (solo supongo) que el GPS aparecerá ante la PDA como un puerto serie sobre BlueTooth, pero ahí acaban mis conocimientos.

    Lo siento.

  4. kimerop Says:

    saludos raster, bueno me parecio genial la entrada
    de tu blog, he intentado realizar lo que comentas en tu blog
    pero me he atorado en algunas cosas,

    Cuando tu comentas
    “Para usar este programa tan sólo tenemos que compilarlo con Mono y luego llamarlo desde la línea de comandos, poniendo como primer parámetro el fichero .exe que queremos convertir.”….

    esto se supone que yo hice …

    baje las librerias primero haciendo un :

    apt-cache search cecil

    libmono-cecil0.4-cil – library to generate and inspect CIL assemblies

    despues las instale ….

    gmcs program.cs -r:Mono.Cecil.dll
    genera program.exe

    despues lo copio a la pda y no corre …

    y lo que yo entendi en tu articulo es hacerlo de la siguiente manera

    “Para usar este programa tan sólo tenemos que compilarlo con Mono”

    >gmcs program.cs

    “llamarlo desde la línea de comandos poniendo como primer parámetro el fichero .exe que queremos convertir”…

    pero a que comando ….

    Gracias….

  5. raster Says:

    Veo que no lo has entendido:

    Primero te bajas de la página de Jean-Baptiste (http://evain.net/public/cf-cecil-patcher.cs.html) el script para modificar las firmas de los ficheros EXE. Como está en una página HTML tienes que copiarlo y pegarlo en un nuevo documento usando tu editor de textos favorito. Digamos que lo grabas como CF-CECIL-PATCHER.CS.

    Lo compilas con mono:

    gmcs cf-cecil-patcher.cs -r:/usr/lib/cli/mono-cecil-0.5/Mono.Cecil.dll

    (a lo mejor tienes que cambiar algo en la parte de la DLL de Cecil; yo la tengo así para Ubuntu 8.04) y obtenemos CF-CECIL-PATCHER.EXE. Este programa es el que cambia la firma digital de nuestros ejecutables de manera que puedan funcionar en una PDA. Para tenerlo disponible cómodamente lo copiamos a /usr/local/bin

    sudo cp cf-cecil-patcher.exe /usr/local/bin/

    Ahora compilas tu programa como de costumbre, con mono, y lo depuras en tu máquina hasta que funcione bien (o no, como prefieras 🙂

    gmcs program.cs

    Esto nos dará un PROGRAM.EXE. Este EXE sólo se puede ejecutar en ordenadores normales, no en PDAs, así que vamos a aplicarle el programa de Jean-Baptiste para convertirlo a un formato válido para nuestra PDA:

    cf-cecil-patcher.exe program.exe

    Ahora el fichero PROGRAM.EXE ya está listo para ser copiado a la PDA.

  6. Rodrigo Says:

    Alguien puede ayuarme com la base de datos que genera Visul Basic 2005.

    Mi problema es que estoy programando para una palm com WM5 lo cual no a sido problema sino hasta querer abrir la BD en una PC tradicional; la BD generada es *.sdf y no la puedo manipulas en mi PC, o bien como genero un archivo plano para poder manejarlo en acces o excel…?

    Les mando saludos y espero que alguien me pueda ayudar

  7. Javier Says:

    Brillante, gracias raster.
    Estaba por iniciar mi primer contacto con la programación para pda y ya me has ahorrado al menos 10 golpes.
    Mil gracias

  8. Pablo Reyes Says:

    He leído todo tu artículo, a pesar de que aún no elijo la PDA ni el SO.

    Trabajo para dos empresas que me han dado libertad de elegir tanto el modelo del PDA como el SO. El mas barato y yo pueda cumplir el pedido: un sistema para viajantes que venden visitando comercios.

    La mayoría me ofrece WM entre la que se destaca “Palm Treo 750” y “Motorola Q8”. Si hoy tuvieras tú esta libertad de elegir: ¿qué PDA y SO eligirías?

    Aclaración: Sea cual sea la opción debo aprender a programar para tal tarea. Conozco VB6, PHP y algo de Python, C++ y Java. Utilizo Ubuntu.

    Un saludo cordial y muchísimas gracias.

  9. raster Says:

    La verdad es que no sabría decirte, no controlo mucho de PDAs. Yo usé la del artículo porque era la que había, me vino impuesta.

    De todas formas, si lleva Windows Mobile, vas a tener que aprender, como mínimo Visual Basic.NET o C# para programarla, por ejemplo usando Visual Studio, o bien usar el truco que comento y programarlo desde Mono (y MonoDevelop).

Leave a Reply

Time limit is exhausted. Please reload CAPTCHA.


Utilizamos cookies para garantizar que tenga la mejor experiencia en nuestro sitio web.