<?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; mono</title>
	<atom:link href="http://blog.colorbase.tw/tag/mono/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.colorbase.tw</link>
	<description>訊息多變的時代裡，需要多學習多思考</description>
	<lastBuildDate>Mon, 15 Aug 2011 03:29:59 +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>.Net Framework透過Mono跨平台的一些技巧</title>
		<link>http://blog.colorbase.tw/programming/529</link>
		<comments>http://blog.colorbase.tw/programming/529#comments</comments>
		<pubDate>Sun, 21 Dec 2008 09:45:32 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[.net framework]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[SharpDevelop]]></category>
		<category><![CDATA[跨平台]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=529</guid>
		<description><![CDATA[因為有了Mono讓原本習慣開發Windows程式的人也可以輕鬆的寫出跨平台的程式，轉移的痛苦度也降低了很多，在此分享幾個.Net Framework透過Mono跨平台的技巧。
 讓SharpDevelop支援Mono

要開發跨平台的程式，當然要讓開發工具支援跨平台的功臣Mono啦。
1. 在 Project &#62;&#62; Project Options 中選擇「Debug」頁籤。
2. 設定Start Action，設定編譯後的執行模式，預設為Start project，亦即使用預設的Debug環境執行，若要以Mono執行，則必須更改為「Start external program」，並指定Mono for Windows的Console執行檔路徑。
3. 設定啟動參數為「&#34;${TargetPath}&#34;」，此代表編譯好的.Net程式執行檔路徑
4. 設定工作目錄為「&#34;${TargetDir}&#34;」，此代表編譯好的.Net程式執行檔所在目錄。
設定好之後按下F5編譯並執行，即會以Mono執行程式了，設定如下圖：

判斷目前正執行的平台
雖然跨平台程式應該與平台無關，但如果在程式中針對平台特性加以優化將會使軟體的功能更加貼近各種平台。
判斷跨平台的程式碼如下：

string SysString = Environment.OSVersion.Platform.ToString();
string SysId = ((int)Environment.OSVersion.Platform).ToString();

switch(Environment.OSVersion.Platform)
{
	case PlatformID.Unix:
		MessageBox.Show("目前執行在 Unix-Like平台");
		break;
	case PlatformID.Win32NT:
	case PlatformID.Win32S:
	case PlatformID.Win32Windows:
	case PlatformID.WinCE:
		MessageBox.Show("目前執行在 Windows 平台");
		break;
}

MessageBox.Show("目前的平台是：" + SysString + " , 平台ID：" + SysId);

針對目前執行系統取得文字檔的換行字元
由於Unix-Like的作業系統文字檔的換行是\n，而Windows則是\r\n，因此可以透過
System.Environment.NewLine 來取得目前系統的換行字元
如果非要呼叫系統API
有些時候，如果非得使用Windows API來達成在Windows下的某些特殊功能，如果使用內嵌的方式呼叫Windows API，在Linux底下根本無法透過mono執行，因為內嵌式的呼叫在程式載入時就會一併載入所需的.dll，此時可以將這些功能寫成一個DLL，再利用前面所提到的方法判斷目前作業系統，如果是在Windows底下，就利用動態調用DLL的方式來呼叫這些API，反之如果不是在Window底下，則進行另外的處理。
以下示範將Window API包裝在DLL裡面，並依據目前執行的作業系統決定是否載入外部DLL並利用其提供的方法，呼叫Windows API來達成所需的功能。
將以下編譯成.dll檔

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace ClassLibrary
{
	public class MyClass
	{
		[DllImport("shell32.dll", CharSet = CharSet.Auto)]
  ...]]></description>
			<content:encoded><![CDATA[<p>因為有了Mono讓原本習慣開發Windows程式的人也可以輕鬆的寫出跨平台的程式，轉移的痛苦度也降低了很多，在此分享幾個.Net Framework透過Mono跨平台的技巧。</p>
<p> <span id="more-529"></span><span style="color: #008080"><strong>讓SharpDevelop支援Mono</strong></span>
</p>
<p>要開發跨平台的程式，當然要讓開發工具支援跨平台的功臣Mono啦。</p>
<p>1. 在 Project &gt;&gt; Project Options 中選擇「Debug」頁籤。</p>
<p>2. 設定Start Action，設定編譯後的執行模式，預設為Start project，亦即使用預設的Debug環境執行，若要以Mono執行，則必須更改為「Start external program」，並指定Mono for Windows的Console執行檔路徑。</p>
<p>3. 設定啟動參數為「&quot;${TargetPath}&quot;」，此代表編譯好的.Net程式執行檔路徑</p>
<p>4. 設定工作目錄為「&quot;${TargetDir}&quot;」，此代表編譯好的.Net程式執行檔所在目錄。</p>
<p>設定好之後按下F5編譯並執行，即會以Mono執行程式了，設定如下圖：</p>
<p><a class="thickbox" href="http://blog/wp-content/uploads/2008/12/usemonoinsharpdevelop.png"><img class="alignnone size-medium wp-image-530" title="usemonoinsharpdevelop" alt="" src="http://blog.colorbase.tw/wp-content/uploads/2008/12/usemonoinsharpdevelop-350x231.png" width="350" height="231" /></a></p>
<p><span style="color: #008080"><strong>判斷目前正執行的平台</strong></span></p>
<p>雖然跨平台程式應該與平台無關，但如果在程式中針對平台特性加以優化將會使軟體的功能更加貼近各種平台。</p>
<p>判斷跨平台的程式碼如下：</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:4b681083-dcd1-4f75-8bc8-41886a1edf8c" class="wlWriterEditableSmartContent">
<pre name="code" class="c#:nogutter">string SysString = Environment.OSVersion.Platform.ToString();
string SysId = ((int)Environment.OSVersion.Platform).ToString();

switch(Environment.OSVersion.Platform)
{
	case PlatformID.Unix:
		MessageBox.Show("目前執行在 Unix-Like平台");
		break;
	case PlatformID.Win32NT:
	case PlatformID.Win32S:
	case PlatformID.Win32Windows:
	case PlatformID.WinCE:
		MessageBox.Show("目前執行在 Windows 平台");
		break;
}

MessageBox.Show("目前的平台是：" + SysString + " , 平台ID：" + SysId);</pre>
</div>
<p><span style="color: #008080"><strong>針對目前執行系統取得文字檔的換行字元</strong></span></p>
<p>由於Unix-Like的作業系統文字檔的換行是\n，而Windows則是\r\n，因此可以透過</p>
<p>System.Environment.NewLine 來取得目前系統的換行字元</p>
<p><span style="color: #008080"><strong>如果非要呼叫系統API</strong></span></p>
<p>有些時候，如果非得使用Windows API來達成在Windows下的某些特殊功能，如果使用內嵌的方式呼叫Windows API，在Linux底下根本無法透過mono執行，因為內嵌式的呼叫在程式載入時就會一併載入所需的.dll，此時可以將這些功能寫成一個DLL，再利用前面所提到的方法判斷目前作業系統，如果是在Windows底下，就利用動態調用DLL的方式來呼叫這些API，反之如果不是在Window底下，則進行另外的處理。</p>
<p>以下示範將Window API包裝在DLL裡面，並依據目前執行的作業系統決定是否載入外部DLL並利用其提供的方法，呼叫Windows API來達成所需的功能。</p>
<p>將以下編譯成.dll檔</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:4aab51ae-a94f-4766-ade6-10a7bac07497" class="wlWriterEditableSmartContent">
<pre name="code" class="c#:nogutter">using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace ClassLibrary
{
	public class MyClass
	{
		[DllImport("shell32.dll", CharSet = CharSet.Auto)]
    	public static extern int ShellExecute( IntPtr hwnd, String lpOperation, String lpFile,  String lpParameters,  String lpDirectory, int nShowCmd);

		public MyClass()
		{
			//其他處理
		}

		//用一個方法成員包裝某個Windows API
		public void WinApiShellExecute(Form caller,string filePath)
		{
			ShellExecute(caller.Handle,"open",filePath,null,null,5);
		}
	}
}
</pre>
</div>
<p>呼叫時，使用以下方式：</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:7f530942-4266-4c29-a545-9b70a820b955" class="wlWriterEditableSmartContent">
<pre name="code" class="c#:nogutter">using System.Reflection;

if(Environment.OSVersion.Platform != PlatformID.Unix)
{ // Windows系統，載入DLL，並藉由DLL裡面的方法呼叫Windows API
	string dllPath = "ClassLibrary.dll";//DLL路徑
	Assembly assLib = Assembly.LoadFrom(dllPath);//動態載入DLL
	//取得Namespace為ClassLibrary的MyClass Type
	Type clsType = assLib.GetType("ClassLibrary.MyClass");
	Object MyClass = Activator.CreateInstance(clsType,new object[]{});//建立Class實體
	MethodInfo mApiInfo=type.GetMethod("WinApiShellExecute");//取得Method成員
	mApiInfo.Invoke(MyClass,new object[]{this,"notepad.exe"});//呼叫包裝API的方法成員
}
else
{ //Unix系統
	//進行其他處理....
}
</pre>
</div>
<p>PS. 這只是範例，如果只是要呼叫外部程式，.Net Framework有更好的作法，不需呼叫Windows API。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/programming/529/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>13</slash:comments>
		</item>
		<item>
		<title>利用MoMA分析.Net程式是否能透過Mono跨平台</title>
		<link>http://blog.colorbase.tw/programming/519</link>
		<comments>http://blog.colorbase.tw/programming/519#comments</comments>
		<pubDate>Sun, 14 Dec 2008 01:27:15 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[.net framework]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[跨平台]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=519</guid>
		<description><![CDATA[Mono 官方提供了一個檢測.Net Framework開發的程式是否能透過Mono跨平台的檢測工具 Mono Migration Analyzer (MoMA)，這個工具可以幫忙偵測出.Net程式無法跨平台可能的潛在問題。

測試MoMA
為了這測試這個工具，我找來之前寫的小工具重複文字產生器來當實驗品。
1.首先下載 MoMA，因為MoMA是以.Net Framework寫的，因此如果已經安裝.Net Framework的話，解壓縮後即可執行。
2. 在選擇檔案那一頁中，按下「+」鈕，挑選要進行分析的檔案，由於重複文字產生器並沒有用到其他額外的.dll，只有簡單的主執行檔，因此只將StrTemplate.exe選進來。

3.選完檔案之後，按Next即可進行分析。
4.在分析概要頁中顯示找到1個平台請求呼叫的潛藏問題。

5.到底是什麼原因造成的錯誤呢？按下View Detail Report顯示詳細的報告。
6.詳細報告中指出問題出在StrTemplate.exe中的Label2Click呼叫了來自shell32.dll的ShellExecute。

7.結果很明顯，因為跨平台的程式應該與系統無關才對，但我卻在關於我中呼叫了ShellExecute這個Windows API來開啟網址，因此當然無法跨平台囉。
相關連結

Mono Migration Analyzer (MoMA)
Mono

]]></description>
			<content:encoded><![CDATA[<p>Mono 官方提供了一個檢測.Net Framework開發的程式是否能透過Mono跨平台的檢測工具 Mono Migration Analyzer (MoMA)，這個工具可以幫忙偵測出.Net程式無法跨平台可能的潛在問題。</p>
<p><span id="more-519"></span></p>
<p><strong><span style="color: #008080;">測試MoMA</span></strong></p>
<p>為了這測試這個工具，我找來之前寫的小工具<a href="http://blog.colorbase.tw/portfolio/287" target="_blank">重複文字產生器</a>來當實驗品。</p>
<p>1.首先<a href="http://mono-project.com/MoMA" target="_blank">下載 MoMA</a>，因為MoMA是以.Net Framework寫的，因此如果已經安裝.Net Framework的話，解壓縮後即可執行。</p>
<p>2. 在選擇檔案那一頁中，按下「+」鈕，挑選要進行分析的檔案，由於重複文字產生器並沒有用到其他額外的.dll，只有簡單的主執行檔，因此只將StrTemplate.exe選進來。</p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2008/12/selectassemblys.png"><img class="alignnone size-medium wp-image-523" title="selectassemblys" src="http://blog.colorbase.tw/wp-content/uploads/2008/12/selectassemblys-300x208.png" alt="" width="300" height="208" /></a></p>
<p>3.選完檔案之後，按Next即可進行分析。</p>
<p>4.在分析概要頁中顯示找到1個平台請求呼叫的潛藏問題。</p>
<p><a href="../wp-content/uploads/2008/12/analysis-summary.png"><img title="analysis-summary" src="../wp-content/uploads/2008/12/analysis-summary-300x208.png" alt="" width="300" height="208" /></a></p>
<p>5.到底是什麼原因造成的錯誤呢？按下View Detail Report顯示詳細的報告。</p>
<p>6.詳細報告中指出問題出在StrTemplate.exe中的Label2Click呼叫了來自shell32.dll的ShellExecute。</p>
<p><a href="../wp-content/uploads/2008/12/moma-scan-results.png"><img title="moma-scan-results" src="../wp-content/uploads/2008/12/moma-scan-results-300x164.png" alt="" width="300" height="164" /></a></p>
<p>7.結果很明顯，因為跨平台的程式應該與系統無關才對，但我卻在關於我中呼叫了ShellExecute這個Windows API來開啟網址，因此當然無法跨平台囉。</p>
<p>相關連結</p>
<ul>
<li><a href="http://mono-project.com/MoMA" target="_blank">Mono Migration Analyzer (MoMA)</a></li>
<li><a href="http://mono-project.com/" target="_blank">Mono</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/programming/519/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在Ubuntu上執行.Net開發的程式</title>
		<link>http://blog.colorbase.tw/programming/516</link>
		<comments>http://blog.colorbase.tw/programming/516#comments</comments>
		<pubDate>Fri, 12 Dec 2008 06:15:41 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[.net framework]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[跨平台]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=516</guid>
		<description><![CDATA[今天看了 Installing and using mono on Ubuntu 這篇文章之後，測試了一下在Ubuntu中執行.Net的程式
該篇文章對Mono on Ubuntu 講的非常詳細，其中包括如何在Ubuntu中透過mono附帶的編譯器，編譯.Net程式
讓Ubuntu支援.Net WindowForms程式
該文作者是在Ubuntu底下，利用Mono的編譯器進行編譯，因此裝了許多的套件，但如果開發環境是在WIndows底下，而且覺得用命令列編譯太麻煩，其實只要安裝mono、libmono-winforms1.0-cil、libmono-winforms2.0-cil三個套件，就可以直接執行已經在Windows底下編譯好的.Net程式，因為在Windows有更好用的 MS Visual Studio跟SharpDevelop等RAD工具，確實可以省下很多麻煩。
Ubuntu中Mono的安裝指令為：
sudo apt-get install mono
sudo apt-get install libmono-winforms1.0-cil libmono-winforms2.0-cil
又或者使用Ubuntu的Synaptic套件管理程式來安裝更方便(用慣GUI介面的人 XD)
小小測試
我在SharpDevelop中使用C#寫了一些簡單的小東西來做測試，GUI的部份只使用最基本的WindowForms元件，編譯完成後，直接拿到Ubuntu底下，輸入：
mono 執行檔名.exe
該測試程式中使用了以下的.Net套件

System
System.Collections.Generic
System.Drawing
System.Windows.Forms
System.Net
System.Threading
System.Collections
System.Xml
System.IO
System.Text

執行結果，各個功能執行無誤，執行畫面如下：

如同該篇文章所說，Mono並無支援所有的WindowForms元件，後來又測試了使用ToolTip元件，發現無法執行，原因似乎是不支援氣泡提示。
結論
雖然很遺憾Mono仍尚未完全支援.Net所提供的套件，但是以目前支援的程度所能達到的應用，應該可以說數不完了。
相關連結

Installing and using mono on Ubuntu

]]></description>
			<content:encoded><![CDATA[<p>今天看了 <a href="http://www.builderau.com.au/program/dotnet/soa/Gallery-Installing-and-using-mono-on-Ubuntu/0,339028399,339279567,00.htm" target="_blank">Installing and using mono on Ubuntu</a> 這篇文章之後，測試了一下在Ubuntu中執行.Net的程式</p>
<p>該篇文章對Mono on Ubuntu 講的非常詳細，其中包括如何在Ubuntu中透過mono附帶的編譯器，編譯.Net程式<span id="more-516"></span></p>
<p><span style="color: #008080;"><strong>讓Ubuntu支援.Net WindowForms程式</strong></span></p>
<p>該文作者是在Ubuntu底下，利用Mono的編譯器進行編譯，因此裝了許多的套件，但如果開發環境是在WIndows底下，而且覺得用命令列編譯太麻煩，其實只要安裝mono、libmono-winforms1.0-cil、libmono-winforms2.0-cil三個套件，就可以直接執行已經在Windows底下編譯好的.Net程式，因為在Windows有更好用的 MS Visual Studio跟SharpDevelop等RAD工具，確實可以省下很多麻煩。</p>
<p>Ubuntu中Mono的安裝指令為：</p>
<blockquote><p>sudo apt-get install mono<br />
sudo apt-get install libmono-winforms1.0-cil libmono-winforms2.0-cil</p></blockquote>
<p>又或者使用Ubuntu的Synaptic套件管理程式來安裝更方便(用慣GUI介面的人 XD)</p>
<p><span style="color: #008080;"><strong>小小測試</strong></span></p>
<p>我在SharpDevelop中使用C#寫了一些簡單的小東西來做測試，GUI的部份只使用最基本的WindowForms元件，編譯完成後，直接拿到Ubuntu底下，輸入：</p>
<p>mono 執行檔名.exe</p>
<p>該測試程式中使用了以下的.Net套件</p>
<ul>
<li>System</li>
<li>System.Collections.Generic</li>
<li>System.Drawing</li>
<li>System.Windows.Forms</li>
<li>System.Net</li>
<li>System.Threading</li>
<li>System.Collections</li>
<li>System.Xml</li>
<li>System.IO</li>
<li>System.Text</li>
</ul>
<p>執行結果，各個功能執行無誤，執行畫面如下：</p>
<p><a class="thickbox" href="http://blog.colorbase.tw/wp-content/uploads/2008/12/csharponubuntu.png"><img class="alignnone size-medium wp-image-517" title="csharponubuntu" src="http://blog.colorbase.tw/wp-content/uploads/2008/12/csharponubuntu-330x350.png" alt="" width="330" height="350" /></a></p>
<p>如同該篇文章所說，Mono並無支援所有的WindowForms元件，後來又測試了使用ToolTip元件，發現無法執行，原因似乎是不支援氣泡提示。</p>
<p><span style="color: #008080;"><strong>結論</strong></span></p>
<p>雖然很遺憾Mono仍尚未完全支援.Net所提供的套件，但是以目前支援的程度所能達到的應用，應該可以說數不完了。</p>
<p><strong><span style="color: #008080;">相關連結</span></strong></p>
<ul>
<li><a href="http://www.builderau.com.au/program/dotnet/soa/Gallery-Installing-and-using-mono-on-Ubuntu/0,339028399,339279567,00.htm" target="_blank">Installing and using mono on Ubuntu</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/programming/516/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.Net Framework 跨平台初步參考</title>
		<link>http://blog.colorbase.tw/programming/512</link>
		<comments>http://blog.colorbase.tw/programming/512#comments</comments>
		<pubDate>Mon, 08 Dec 2008 15:56:23 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[.net framework]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[MonoDevelop]]></category>
		<category><![CDATA[SharpDevelop]]></category>
		<category><![CDATA[跨平台]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=512</guid>
		<description><![CDATA[.Net Framework 這個由微軟開發的軟體開發/執行平臺，現在可真是越來越多人使用了，雖然.Net的運行架構跟Java非常相似，但是微軟似乎沒有直接提供其他作業系統的.Net Framework運行環境。
跨平台的.Net Framework -  Mono
幸好，有一個名為Mono的Open Source Project，實現了這個可能，Mono官方首頁斗大的標題寫著：Mono is a cross platform, open source .NET development framework.
這意謂著.Net開發的程式可以在Mono的架構之下運行於各種系統平台，換個方式說，只要Mono Framework能運行的系統平台，就能執行.Net所開發的應用程式，而Mono從2004年發展至今已經相當完善。
目前Mono能運行於以下作業系統：

Linux
Mac OS X, iPhone OS
Sun Solaris
BSD &#8211; OpenBSD, FreeBSD, NetBSD
Microsoft Windows
Nintendo Wii

Mono主要是為了.Net Framework能跨平台執行而開發的，因此它支援C#及VB.Net所開發的程式，但是Mono的貢獻不僅如此， Mono還照顧到了更多語言的使用者，甚至是腳本式的語言PHP、Javascript等都能開發Mono Framework的應用程式，讓 Write Once, Run Anywhere 不再是Java使用者的獨享的好處了，目前Mono支援的語言如下：

C#
Java
Boo
Nemerle
Visual Basic.NET
JavaScript
Oberon
PHP
Object Pascal
LUA
Cobra
Python
其他語言&#8230;Component Pascal、Delta Forth、DotLisp、#Smalltalk

透過Mono還能讓原本只能運行於IIS下的ASP.Net透過mod_mono運行於Apache中，用更直接的方式來說，透過Mono可以讓Linux所架設的伺服器也能夠執行ASP.Net的Web應用程式了。
.Net開發工具
開發.Net的應用程式，其實並不一定要使用官方所開發的工具，如果沒有那麼大的需求，或者學生、業餘玩家也有免費的RAD工具可以使用。
Windows平台：SharpDevelop
這是一套用.Net Framework所開發的RAD工具，與其他RAD一樣，支援拖拉點選的方式協助開發應用程式，擁有相當完善的開發功能，如：程式碼提示、元件拖拉、屬性編輯、Debug&#8230;.等等，支援的語言有C#, VB.NET , Boo，更重要的是它Free!

Linux平台：MonoDevelop
與SharpDevelop非常相似的RAD工具，事實上它就是以SharpDevelop為基礎所改寫、移植到Linux的一套RAD工具，一樣也是Free!

相關連結

Mono官方網站
mod_mono
SharpDevelop
MonoDevelop

以上，我剛接觸這些東西不久，對它們還不是很熟悉，若有謬誤歡迎指正，若有其他更好的東西，也歡迎留言分享
]]></description>
			<content:encoded><![CDATA[<p>.Net Framework 這個由微軟開發的軟體開發/執行平臺，現在可真是越來越多人使用了，雖然.Net的運行架構跟Java非常相似，但是微軟似乎沒有直接提供其他作業系統的.Net Framework運行環境。<span id="more-512"></span></p>
<p><span style="color: #008080;"><strong>跨平台的.Net Framework -  Mono</strong></span></p>
<p>幸好，有一個名為Mono的Open Source Project，實現了這個可能，<a href="http://mono-project.com/" target="_blank">Mono官方</a>首頁斗大的標題寫著：Mono is a cross platform, open source .NET development framework.</p>
<p>這意謂著.Net開發的程式可以在Mono的架構之下運行於各種系統平台，換個方式說，只要Mono Framework能運行的系統平台，就能執行.Net所開發的應用程式，而Mono從2004年發展至今已經相當完善。</p>
<p>目前Mono能運行於以下作業系統：</p>
<ul>
<li>Linux</li>
<li>Mac OS X, iPhone OS</li>
<li>Sun Solaris</li>
<li>BSD &#8211; OpenBSD, FreeBSD, NetBSD</li>
<li>Microsoft Windows</li>
<li>Nintendo Wii</li>
</ul>
<p>Mono主要是為了.Net Framework能跨平台執行而開發的，因此它支援C#及VB.Net所開發的程式，但是Mono的貢獻不僅如此， Mono還照顧到了更多語言的使用者，甚至是腳本式的語言PHP、Javascript等都能開發Mono Framework的應用程式，讓 Write Once, Run Anywhere 不再是Java使用者的獨享的好處了，目前Mono支援的語言如下：</p>
<ul>
<li>C#</li>
<li>Java</li>
<li>Boo</li>
<li>Nemerle</li>
<li>Visual Basic.NET</li>
<li>JavaScript</li>
<li>Oberon</li>
<li>PHP</li>
<li>Object Pascal</li>
<li>LUA</li>
<li>Cobra</li>
<li>Python</li>
<li>其他語言&#8230;Component Pascal、Delta Forth、DotLisp、#Smalltalk</li>
</ul>
<p>透過Mono還能讓原本只能運行於IIS下的ASP.Net透過<a href="http://www.mono-project.com/Mod_mono" target="_blank">mod_mono</a>運行於Apache中，用更直接的方式來說，透過Mono可以讓Linux所架設的伺服器也能夠執行ASP.Net的Web應用程式了。</p>
<p><span style="color: #008080;"><strong>.Net開發工具</strong></span></p>
<p>開發.Net的應用程式，其實並不一定要使用官方所開發的工具，如果沒有那麼大的需求，或者學生、業餘玩家也有免費的RAD工具可以使用。</p>
<p><strong>Windows平台</strong>：SharpDevelop</p>
<p>這是一套用.Net Framework所開發的RAD工具，與其他RAD一樣，支援拖拉點選的方式協助開發應用程式，擁有相當完善的開發功能，如：程式碼提示、元件拖拉、屬性編輯、Debug&#8230;.等等，支援的語言有C#, VB.NET , Boo，更重要的是它Free!</p>
<p><a class="thickbox" href="http://blog.colorbase.tw/wp-content/uploads/2008/12/sharpdevelop.png"><img class="alignnone size-medium wp-image-513" title="sharpdevelop" src="http://blog.colorbase.tw/wp-content/uploads/2008/12/sharpdevelop-350x266.png" alt="" width="350" height="266" /></a></p>
<p><strong>Linux平台</strong>：MonoDevelop</p>
<p>與SharpDevelop非常相似的RAD工具，事實上它就是以SharpDevelop為基礎所改寫、移植到Linux的一套RAD工具，一樣也是Free!</p>
<p><a class="thickbox" href="http://blog.colorbase.tw/wp-content/uploads/2008/12/monodevelop.png"><img class="alignnone size-medium wp-image-514" title="monodevelop" src="http://blog.colorbase.tw/wp-content/uploads/2008/12/monodevelop-350x242.png" alt="" width="350" height="242" /></a></p>
<p><strong><span style="color: #008080;">相關連結</span></strong></p>
<ul>
<li><a href="http://www.mono-project.com/" target="_blank">Mono官方網站</a></li>
<li><a href="http://www.mono-project.com/Mod_mono" target="_blank">mod_mono</a></li>
<li><a href="http://www.icsharpcode.net/OpenSource/SD/ " target="_blank">SharpDevelop</a></li>
<li><a href="http://monodevelop.com/" target="_blank">MonoDevelop</a></li>
</ul>
<p>以上，我剛接觸這些東西不久，對它們還不是很熟悉，若有謬誤歡迎指正，若有其他更好的東西，也歡迎留言分享</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/programming/512/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

