Aplicaciones con GUI en .NET: ¿Gtk# o Windows Forms?

Hace tiempo discutía con algunas personas la mejor manera de usar Mono tanto en el escritorio Linux como en Windows. Me refiero al momento de escoger entre Windows Forms y Gtk#, para desarrollar aplicaciones con interfaz gráfica. Personalmente pienso que la mejor opción es, inclinándome hacia el lado del software libre, usar Mono + Gtk#. Claro, eso también depende de tus gustos como desarrollador y, más importante aún, de las necesidades del proyecto a realizar.
Lo que quiero enseñarles en esta entrada es cómo se pueden tomar diferentes caminos, y aclarar algunas dudas que me han planteado ciertos lectores. Siendo así, vamos a tomar como ejemplo a dos programas sencillos: el primero usando Gtk# y corriendo tanto en Linux como Windows, y el otro usando Windows Forms corriendo tanto en Windows como Linux.
Desarrollando y ejecutando aplicaciones Gtk# y Windows Forms usando Mono
Antes de comenzar con los ejercicios, veamos qué necesitamos para desarrollar y ejecutar aplicaciones que usen Gtk# y Windows Forms. Es necesario (obviamente) tener dicho framework instalado; afortunadamente, la mayoría de las distribuciones Gnu/Linux actuales tienen los paquetes necesarios en los repositorios, e incluso vienen con lo necesario para ejecutar aplicaciones desarrolladas con Mono (como Tomboy, Fspot o Banshee). Para compilar aplicaciones C# para mono es necesario utilizar el CSharp Compiler (cms).
También, es posible descargar mono para los más importantes sistemas operativos, incluyendo por supuesto sistemas Microsoft Windows. Para tal caso es posible descargar una versión completa (Mono + Gtk# + XSP), o tan solo el intérprete + Gtk# para un Framework .NET ya instalado sobre el ordenador.
Código del programa que usa Gtk#
//Ejemplo GTK (EjemploGtk.cs)
using Gtk;
using System;
class EjemploGtk {
static void Main()
{
Application.Init ();
//Crear el boton
Button btn = new Button (“Hola monito!”);
//Asignar un evento al evento Clic del boton
btn.Clicked += new EventHandler (hola);
//Crear el objeto ventana
Window ventana = new Window (“Lindo primate!”);
//Asignar un metodo al evento Cerrar ventan
ventana.DeleteEvent += new DeleteEventHandler (cerrar_ventana);
//Asigna el ancho y alto de la ventana
ventana.DefaultWidth = 200;
ventana.DefaultHeight = 60;
//Anyadir el boton a la ventana
ventana.Add (btn);
//Mostrar la ventana
ventana.ShowAll ();
//Ejecutar la aplicacion
Application.Run ();
}
static void cerrar_ventana (object obj, DeleteEventArgs args)
{
Application.Quit ();
}
static void hola (object obj, EventArgs args)
{
Console.WriteLine(“Lindo monito!”);
Application.Quit ();
}
}
Para compilarlo y ejecutarlo puedes usar los siguientes comandos:
mcs -pkg:gtk-sharp-2.0 EjemploGtk.cs
mono EjemploGtk.exe
El resultado es el mismo tanto en Linux como en Windows:

Código del programa que usa Windows Forms
Este programa hace exactamente lo mismo que el anterior, pero esta vez usando Windows Forms para la interfaz gráfica:
//Ejemplo Windows Forms (EjemploWinForms.cs)
using System.Drawing;
using System.Windows.Forms;
using System;
class EjemploWinForms : Form{
static void Main(){
Application.Run(new EjemploWinForms());
}
public EjemploWinForms() {
//Crear e iniciar el boton, y sus propiedades
Button boton = new Button();
boton.Location = new Point(0, -1);
boton.Name = “boton”;
boton.Size = new System.Drawing.Size(193, 60);
boton.TabIndex = 0;
boton.Text = “Botoncito”;
//Asignar un evento al evento Clic del boton
boton.Click += new System.EventHandler(hola);
//Indicar el tamanyo de la ventana
ClientSize = new System.Drawing.Size(193, 60);
//Anyadir el boton
Controls.Add(boton);
Text = “Ventanita”;
ResumeLayout(false);
}
private void hola(object sender, EventArgs e) {
Console.WriteLine(“Un mensajito!”);
Close ();
}
}
Para compilarlo y ejecutarlo puedes usar los siguientes comandos:
mcs -r:System.Drawing.dll,System.Windows.Forms.dll EjemploWinForms.cs
mono EjemploWindowsForms.exe
El resultado es el mismo tanto en Linux como en Windows:

Consideraciones a tener en cuenta
Al momento de desarrollar aplicaciones con GUIs en C# de manera rápida, tenemos basicamente dos opciones:
- Podemos usar Monodevelop que incluye un editor de interfaces gráficas basado en Stetic y que por supuesto desarrolla dichas interfaces bajo Gtk#.
- O usar el editor de interfaces de Microsoft Visual Studio que, aunque no es libre, he de reconocer que es bastante bueno y completo. En este caso las aplicaciones correrían usando Windows Forms.
Por supuesto, si deseamos usar Mono como plataforma de desarrollo no vale la pena usar herramientas Microsoft. De hecho, opino que el framework de Mono incluye librerías para ejecutar aplicaciones que usen Windows Forms, no con el fin de desarrollar aplicaciones que usen dichas librerías, sino para facilitar la migración de proyectos existentes hacia Mono.
Enlaces interesantes
Descargar código fuente de los ejemplos
47 Comentarios | deja el tuyo





Interesante,
justamente en estos días estoy evaluando meterme a un proyecto de código libre que está hecho en C# para Windows. Una de las cosas que estaba evaluando es si podría modificarlo programando bajo Linux. No conocía GTK#.
Hace años aprendí C# en la universidad pero ya me olvidé jeje, supongo que como actualmente en el trabajo programo en Java, no me será difícil volver a recordar C#.
Por cierto, el proyecto es Open Dental, un administrador para consultorios dentales
http://www.open-dent.com/
Que buen post. me despejo muchas dudas, estaba buscando la mejor forma de realizar software multiplataforma, que no fuera Java, python,jython. pero ahora no se por cual decidirme, GTK o Windows Forms.
no hay nada que decidir. Windows Forms no es multiplataforma. ¿no leiste el articulo o que??
la gran pregunta es ¿¿¿GTK O QT???
Gtk#!!!!!
funciona igual para dotgnu??
Para ser sincero nunca he jugado con GnuDot… voy a chechar a ver qué
Y por qué no lo haces en Java, Arkantos ??
Por cierto, Casidiablo o Christian, está muy interesante tu sitio, con tu permiso me voy a tomar tiempo para leerlo todo. Me gusta mucho que gente como tú se tome la molestia de subir post con cosas tan interesantes.
Debo decirte que soy fielmente seguidor de Java y .NET, así que tu sitio formará parte desde hoy en mi lista de favoritos. Gracias
¿A caso la implementación de Windows.Forms de mono no es software libre? Si vale no tiene editor… Pero la sencillez de windows forms es simplemente espectacular, incluso sin editor, muy por encima de gtk# o el swing de Java.
hola tengo un problema necesito instalar el intouch software de simulacion scada, pero necesito tener instalado el netframework 1.1 en la raiz del windows xp lo tengo intalado pero no corre lo he probado en otras maquinas y si corre, incluso antes de ejecutar la palicacion aparece una leyenda “aplicando los servicios de .net”quisiera saber si hay forma de instalar este software en ubuntu 8.01 claro junto con el framework 1.1 espero puedean ausilairme ya que ni en windows en mi lap me lo deja correr….
@williberto: Claro, puedes instalarlo en Ubuntu. Usa wine, o winedoors (más fácil con el segundo).
Un saludo
hola otra vez. me surgio un detalle al instalar el software me pide que tenga windows xp profesional con service pack 2, pero en las opciones de wine solo viene windows xp como le hago para instalar los componentes de profesional sp2 al wine…mi version del wine es la 1.0 mencionan en un portal como hacerlo para Visual Basic pero Visual corre en cualquier windows xp pero el intouch afuersa requiere windows XP Profesional con SP2
Lo siento, willibertomm , no tengo ni idea de como solucionar ese error
He estado buscando, pero nada.
Lo único que encontré es esto:
http://www.winehq.org/pipermail/wine-patches/2005-August/019934.html
Pero contemplaría recompilar el Wine ;-(
Hola Casidiablo pues primero que nada felicidades por tus tutoriales y gracias por poner la facilidad de poderlos descargar en PDF si no os molesta los colgare en la pagina de Opensuse Latino http://opensuseltn.org y pondre la referencia de donde los e sacado en la seccion de descargas, de antemano gracias por tomarte el tiempo en publicar tus conocieminetos y compartirlos con nosotros
No hay problema, será todo un honor que reproduzcan mis tutoriales.
Un saludo!
Cuando compilo el ejemplo no tengo problema… pero cuando lo intento correr con mono me marca la siguiente excepciòn…¿Què estoy haciendo mal?
Unhandled Exception: System.TypeInitializationException: An exception was thrown by the type initializer for System.Windows.Forms.Form —> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. —> System.TypeInitializationException: An exception was thrown by the type initializer for System.Drawing.GDIPlus —> System.DllNotFoundException: gdiplus.dll