<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>色胚子部落 &#187; 免安裝軟體</title>
	<atom:link href="http://blog.colorbase.tw/tag/%e5%85%8d%e5%ae%89%e8%a3%9d%e8%bb%9f%e9%ab%94/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.colorbase.tw</link>
	<description>訊息多變的時代裡，需要多學習多思考</description>
	<lastBuildDate>Sun, 20 Jun 2010 10:06:49 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>透過Mono讓.Net Framework開發的軟體，搖身一變成為綠色軟體</title>
		<link>http://blog.colorbase.tw/programming/525</link>
		<comments>http://blog.colorbase.tw/programming/525#comments</comments>
		<pubDate>Wed, 17 Dec 2008 02:23:29 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[.net framework]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[免安裝軟體]]></category>
		<category><![CDATA[綠色軟體]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=525</guid>
		<description><![CDATA[雖然.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即可

免安裝版 ...]]></description>
			<content:encoded><![CDATA[<p>雖然.Net Framework 的設計理念非常好，只要使用者的電腦安裝了.Net Framework，那麼在.Net Framework架構下所開發的軟體只需要下載該軟體的執行檔及相關檔案即可直接執行，而不需要經過額外安裝步驟，也因為程式庫早已存在於使用者的電腦中，因此軟體的主執行檔將會明顯小很多，有利於網路下載，所以也有人說這是一種變相的可攜式軟體(Portable Software)、綠色軟體或俗稱免安裝軟體，但如同Java一樣，必須要使用者的電腦已經安裝了執行的平台才能實現，萬一使用者的電腦沒有支援的平台就掛了，對於某些應用而言這樣的東西是完全不列入考慮的，最常見的例子就是應用於安裝光碟及多媒體光碟，隨著光碟片放入光碟機中就會自動執行的Autorun軟體。</p>
<p><span id="more-525"></span></p>
<p>我看到了一篇文章 <a href="http://www.cnblogs.com/daylight/archive/2008/10/02/1303037.html" target="_blank">使C#程序脫離.net框架運行(非飛信方式) </a>，該文作者透過Mono Framework，實現了.Net軟體免安裝即可執行，依照該篇文章的指引，我實做了以下內容。</p>
<p><strong><span style="color: #008080;">.Net Framework透過Mono變成綠色軟體測試</span></strong></p>
<p>1. 首先下載並安裝 <a href="http://www.go-mono.com/mono-downloads/download.html" target="_blank">Mono for Windows, Gtk#, and XSP</a> ，Mono for Windows預設安裝在C:\Program Files\Mono-2.0.1。</p>
<p>2. 撰寫並編譯一個.Net程式。</p>
<p>3. 新建一個資料夾，從Mono安裝目錄中複製其bin、lib資料夾，並把已經編譯好的程式放入其中，這裡我又找來了之前寫的小工具<a href="../portfolio/287" target="_blank">重複文字產生器</a>來當實驗品，因此目錄內容會有這些東西。</p>
<p><a class="thickbox" href="http://blog.colorbase.tw/wp-content/uploads/2008/12/001.png"><img class="alignnone size-medium wp-image-526" title="001" src="http://blog.colorbase.tw/wp-content/uploads/2008/12/001.png" alt="" width="349" height="130" /></a></p>
<p>4. 由於免安裝的.Net程式必須透過Mono來執行，所以原作者介紹使用批次檔來達成，將以下指令存成.bat放在目錄下即可。</p>
<blockquote><p>bin\mono.exe StrTemplate.exe</p></blockquote>
<p>但這樣的方式執行後除了原本該執行的StrTemplate.exe之外還會有一個因為批次檔呼叫Mono Console所開啟的命令列視窗，軟體執行中還不可以將該視窗關閉，實在有礙觀瞻。</p>
<p>所以採用原作者的建議，另外寫一個前導的小程式會是比較好的作法，因此我透過<a href="http://www.bloodshed.net/devcpp.html" target="_blank">Dev C++</a>寫一個Console Application小程式來解決這個問題，程式碼如下，編譯後將該執行檔一同放入新建立的資料夾中。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="c:nogutter">
#include <cstdlib>
#include <windows.h>
using namespace std;

int main(int argc, char *argv[])
{
    WinExec("bin\\mono.exe StrTemplate.exe",SW_SHOWNORMAL);
    return EXIT_SUCCESS;
}
</pre>
</div>
<p>5. 至此，綠色版的.Net軟體已經算完成了，執行編譯好的前導程式即可呼叫Mono來執行StrTemplate.exe，執行畫面如下，雖然無法顯示Windows XP的樣式，但功能執行上卻沒有任何問題。</p>
<p><a class="thickbox" href="http://blog.colorbase.tw/wp-content/uploads/2008/12/002.png"><img class="alignnone size-medium wp-image-527" title="透過Mono執行的.Net程式" src="http://blog.colorbase.tw/wp-content/uploads/2008/12/002-350x330.png" alt="" width="350" height="330" /></a></p>
<p>6. 最後，由於複製過來的是整個Mono Framework的內容，因此現在整個體積共309 MB，實在是很嚇人，所以必須刪除不必要的部份，經測試在bin目錄中的以下東西是必須的。</p>
<ul>
<li>mono.exe (Mono的Console執行檔)</li>
<li>mono.dll</li>
<li>iconv.dll</li>
<li>intl.dll</li>
<li>libglib-2.0-0.dll</li>
<li>libgthread-2.0-0.dll</li>
</ul>
<p>而\lib\mono\2.0中的mscorlib.dll也是必須的</p>
<p>再來就只剩下\lib\mono\gac\裡面的東西了，這裡必須留下來的.dll程式庫，將依照.Net程式中所使用到的內容而定，我在StrTemplate.exe中使用了以下套件</p>
<ul>
<li>System</li>
<li>System.Collections.Generic</li>
<li>System.Drawing</li>
<li>System.Windows.Forms</li>
<li>System.Collections</li>
</ul>
<p>因此逐一刪除不必要的東西後，留下了4.96 MB的程式庫，Mono總共的體積為9.69 MB。</p>
<p>最後再將全部的內容以7-Zip的格式壓縮，就可以得到一個3.34 MB的壓縮檔，方便於網路下載。</p>
<p><strong><span style="color: #008080;">大功告成</span></strong></p>
<p>下載綠色版的重複文字產生器，解壓縮後執行RunOnMono.exe或RunOnMono.bat即可</p>
<ol>
<li><a href="http://tinoroy.myweb.hinet.net/download/StrTemplate.7z" target="_blank">免安裝版 (3.34MB)</a></li>
<li><a href="http://tinoroy.myweb.hinet.net/download/StrTemplate.exe" target="_blank">自解壓縮版 (3.42MB)</a></li>
</ol>
<p><strong><span style="color: #008080;">延伸思考</span></strong></p>
<p>既然透過Mono可以達成.Net軟體免安裝，加上Mono又是Open Source的專案，那麼只要有人以Mono為基礎開發一套工具，直接將所需的程式庫及.Net軟體包裝起來，就好像Delphi跟C++Builder，能將packages、dynamic RTL包裝成單一執行檔一樣，相信.Net以後也有機會能以單一執行檔的方式或者不用透過呼叫mono.exe的方式執行，讓.Net程式成為更真實的綠色軟體！或許這樣的東西早已經存在了，只是我還沒有發現罷了。</p>
<p>又或者再動點手腳，透過Mono甚至可以達成免安裝且跨平台哦！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/programming/525/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
