透過Mono讓.Net Framework開發的軟體,搖身一變成為綠色軟體
Posted in 十二月 17th, 2008 by 阿育 | Filed under 程式設計 | Comments (9)雖然.Net Framework 的設計理念非常好,只要使用者的電腦安裝了.Net Framework,那麼在.Net Framework架構下所開發的軟體只需要下載該軟體的執行檔及相關檔案即可直接執行,而不需要經過額外安裝步驟,也因為程式庫早已存在於使用者的電腦中,因此軟體的主執行檔將會明顯小很多,有利於網路下載,所以也有人說這是一種變相的可攜式軟體(Portable Software)、綠色軟體或俗稱免安裝軟體,但如同Java一樣,必須要使用者的電腦已經安裝了執行的平台才能實現,萬一使用者的電腦沒有支援的平台就掛了,對於某些應用而言這樣的東西是完全不列入考慮的,最常見的例子就是應用於安裝光碟及多媒體光碟,隨著光碟片放入光碟機中就會自動執行的Autorun軟體。
我看到了一篇文章 使C#程序脫離.net框架運行(非飛信方式) ,該文作者透過Mono Framework,實現了.Net軟體免安裝即可執行,依照該篇文章的指引,我實做了以下內容。
.Net Framework透過Mono變成綠色軟體測試
1. 首先下載並安裝 Mono for Windows, Gtk#, and XSP ,Mono for Windows預設安裝在C:\Program Files\Mono-2.0.1。
2. 撰寫並編譯一個.Net程式。
3. 新建一個資料夾,從Mono安裝目錄中複製其bin、lib資料夾,並把已經編譯好的程式放入其中,這裡我又找來了之前寫的小工具重複文字產生器來當實驗品,因此目錄內容會有這些東西。
4. 由於免安裝的.Net程式必須透過Mono來執行,所以原作者介紹使用批次檔來達成,將以下指令存成.bat放在目錄下即可。
bin\mono.exe StrTemplate.exe
但這樣的方式執行後除了原本該執行的StrTemplate.exe之外還會有一個因為批次檔呼叫Mono Console所開啟的命令列視窗,軟體執行中還不可以將該視窗關閉,實在有礙觀瞻。
所以採用原作者的建議,另外寫一個前導的小程式會是比較好的作法,因此我透過Dev C++寫一個Console Application小程式來解決這個問題,程式碼如下,編譯後將該執行檔一同放入新建立的資料夾中。
#include#include using namespace std; int main(int argc, char *argv[]) { WinExec("bin\\mono.exe StrTemplate.exe",SW_SHOWNORMAL); return EXIT_SUCCESS; }
5. 至此,綠色版的.Net軟體已經算完成了,執行編譯好的前導程式即可呼叫Mono來執行StrTemplate.exe,執行畫面如下,雖然無法顯示Windows XP的樣式,但功能執行上卻沒有任何問題。
6. 最後,由於複製過來的是整個Mono Framework的內容,因此現在整個體積共309 MB,實在是很嚇人,所以必須刪除不必要的部份,經測試在bin目錄中的以下東西是必須的。
- mono.exe (Mono的Console執行檔)
- mono.dll
- iconv.dll
- intl.dll
- libglib-2.0-0.dll
- libgthread-2.0-0.dll
而\lib\mono\2.0中的mscorlib.dll也是必須的
再來就只剩下\lib\mono\gac\裡面的東西了,這裡必須留下來的.dll程式庫,將依照.Net程式中所使用到的內容而定,我在StrTemplate.exe中使用了以下套件
- System
- System.Collections.Generic
- System.Drawing
- System.Windows.Forms
- System.Collections
因此逐一刪除不必要的東西後,留下了4.96 MB的程式庫,Mono總共的體積為9.69 MB。
最後再將全部的內容以7-Zip的格式壓縮,就可以得到一個3.34 MB的壓縮檔,方便於網路下載。
大功告成
下載綠色版的重複文字產生器,解壓縮後執行RunOnMono.exe或RunOnMono.bat即可
延伸思考
既然透過Mono可以達成.Net軟體免安裝,加上Mono又是Open Source的專案,那麼只要有人以Mono為基礎開發一套工具,直接將所需的程式庫及.Net軟體包裝起來,就好像Delphi跟C++Builder,能將packages、dynamic RTL包裝成單一執行檔一樣,相信.Net以後也有機會能以單一執行檔的方式或者不用透過呼叫mono.exe的方式執行,讓.Net程式成為更真實的綠色軟體!或許這樣的東西早已經存在了,只是我還沒有發現罷了。
又或者再動點手腳,透過Mono甚至可以達成免安裝且跨平台哦!







七月 23, 2009 at 12:53 下午
想請問用vb.net寫的程式可不可以,編譯時是否有參數要加?
我試過用visual studio 2005做一個很簡單的程式(一張form加一個button),用mono來執行,但沒有反應
七月 23, 2009 at 10:04 下午
嗨 James
編譯後的東西基本上都一樣吧,不需要加特別的參數
會不會是你哪邊弄錯了?或者包含中文路徑?
十月 13, 2009 at 10:50 下午
Hi~請問你有試過OS是windows 2000的狀況
執行Mono嗎?
我只拉一個簡單的Form
然後跟您一樣的步驟將檔案放在C槽底下
結果提示命令字元執行一下就關閉了
用您提供的檔案也是出現相同的情況
不知道windows 2000有沒有解
十月 14, 2009 at 2:40 下午
嗨 Chris
我在XP好像也遇過這樣的情形
但我卻是在中文目錄底下發生的
不過據你這麼說,你的情況與我不同
詳細的原因我也不太清楚,抱歉了
十月 19, 2009 at 5:43 下午
Hello~
我找到原因了,因為windows 2000沒有使用gdiplus.dll的樣子
如果套用您提供的小程式
只要把gdiplus.dll丟到該目錄底下就可以正常開啟
分享一下囉~
十月 20, 2009 at 8:38 下午
Hi Chris
原來如此啊,這個問題我倒是沒想過,感謝分享
.net 使用的繪圖函式庫是使用GDI+,而GDI+是XP以後內建的函式庫
但這是微軟的技術,所以我想mono可能沒有實現這個東西專利上不允許而未包含
十一月 26, 2009 at 6:04 下午
vb6..用shell仍會跑出命令視窗…
請問vb6如何call mono 而不會有命令視窗
雖然可以用 vbhide的屬性..不過在部分作業系統 ex win2003..則連mono呼叫出來的主程式都隱藏了..
thankx
十一月 27, 2009 at 7:47 上午
我已經解決了..因為用了 –debug的參數
所以一直有dos畫面…thankx
三月 10, 2010 at 3:03 下午
中文路径有办法解决么?