在Linux系統執行WinForm程式
在Windows系統,最常見的就是Windows Forms程式(以下簡稱WinForm程式),也就是窗體應用程式,比如MS Office,媒體播放器軟體等,WinForm程式比起Web應用程式,明顯在實時性,使用者親和度和操作便捷能力方面強很多。在Linux系統下,雖然也有桌面窗體應用程式,但應用很少。
能否將WinForm程式移植到Linux系統上面呢?
目前,Novell公司的開源專案mono提供了將.NET程式執行在各種非Windows平臺的能力,例如控制檯程式,WinForm程式和ASP.NET等,下面我們對各Linux系統進行一下實驗,由於Liunx系統有不同的發行版,我們分別進行實驗。
1,在Redhat 5.5企業版執行WinForm程式
首先在Redhat上安裝一個mono執行時,如果要執行WinForm程式,還必須安裝mono-winforms外掛,如果你下載了最新的mono 2.8.1版本,已經內建支援了。
下面我們看看一個簡單的WinForm程式在Redhat的執行效果:
顯示效果不錯,跟在Windows下面的VS2008中的設計介面一致,但有一個致命Bug,就是窗體無法接收鍵盤事件,儘管使用滑鼠沒有任何問題,但是一敲擊鍵盤,窗體就失去了響應,在網上查了很多資料,也沒有找到原因。
理論上,在Redhat也可以執行一個mono+Gtk#的窗體介面,無賴我的Redhat先是裝的mono 2.8.1,我當前使用的monodeveloper開發的Gtk程式必須使用mono 2.8.2的庫。
2,在OpenSUSE 上執行WinForm程式
OpenSUSE 是一個很漂亮的Linux發行版,我在http://www.go-mono.com/mono-downloads/download.html
下載了一個VMWare的虛擬機器,下載地址:
http://ftp.novell.com/pub/mono/appliance/2.8.2/Mono-2.8.2-vmx.zip
系統內建了mono的執行環境和開發環境,下面是該虛擬機器的系統桌面:
在它的英文環境下,執行MonoWinForm程式,除了漢字無法顯示,沒有Redhat中的無法輸入文字的問題
切換OpenSUSE系統到簡體中文環境,再次執行MonoWinForm程式,雖然可以顯示出漢字,但是文字框和窗體大小顯示嚴重有問題,整個窗體都變了形,輸入文字反應奇慢,不過沒有RedHat中窗體失去響應的問題。
3,在OpenSUSE上執行Gtk#應用程式
按照mono官方的說法,要想開發跨平臺的窗體應用程式,窗體的介面開發應該選擇Gtk#,而不是Windows GUI。下載一個Mono develop,就可以開發mono+Gtk#的應用程式了。
下載地址:http://monodevelop.com/Download
選擇你使用的系統即可按照說明下載合適的版本,我下載的是Windows版本的。
下面是MonoDevelop的開發環境:
將此程式編譯好之後,釋出到OpenSUSE上,看看執行效果:
結果執行效果完全正常,跟直接在Windows系統一樣,而且中文顯示正常。
本想將這個Gtk程式移植到Redhat上面去,無耐說沒有Gtk#的執行庫,單獨安裝也安裝不上。
下面是該窗體的程式碼:
using System;
using Gtk;
public partial class MainWindow : Gtk.Window
{
public MainWindow () : base(Gtk.WindowType.Toplevel)
{
Build ();
}
protected void OnDeleteEvent (object sender, DeleteEventArgs a)
{
Application.Quit ();
a.RetVal = true;
}
protected virtual void OnButton1Clicked (object sender, System.EventArgs e)
{
MessageDialog msg=new MessageDialog(this,DialogFlags.NoSeparator,MessageType.Info,ButtonsType.Ok,"{0}","aaaa");
msg.Text="你好,"+this.entry1.Text;
msg.Show();
}
}
我採用的是MessageDialog來模擬Windows平臺的MessageBox,但發現執行後,那個對話方塊的OK按鈕不管用,按下後對話方塊不消失,還望哪位Gtk#開發的高人告訴一下。
總結:
目前在Linux平臺上執行WinForm程式基本上是可行的,推薦使用OpenSUSE發行版,不過對WinForm應用程式的中文支援還有問題。
如果要開發真正跨平臺的窗體應用程式,推薦使用Gtk#做開發,它開發出的.NET程式,即可執行在Linux系統,也可以執行在Windows系統。