隨著Mono項目的成熟,MonoDevelop這一Mono平台上的首選開發工具也開始了它的跨平台計劃,按計劃,MonoDevelo在2.2版本將完全實現在*Unix,Windows,Mac系統上運行,同樣的,今日,官方也推出了關於Mac和Windows的Preview版本,windows版的為:http://monodevelop.com/Download/Windows_Preview,它建立在Microsoft .Net Framework3.5的基礎上,同時需要Gtk#的支援.目前Monodevelop的windows版還有一些問題,不過這已經讓人很振奮了,畢竟,windows上又多了一個免費的完整的.net平台和開發環境.
將MonoDevelop做成綠色版的首要前提是,你的系統上裝了.Net Framework3.5,當然,向我們這樣的.net開發人員,這點自然不是問題,那麼關鍵在於Gtk#的支援了,到官方下載安裝檔案,解開之後可以得到Gtk#的runtime,看起來如:
這其中也包含了Gtk+的運行環境,只需要在系統Path中加入bin目錄的路徑,即可實現對所有gtk+/Gtk#程式的運行支援.這樣一來,我們算是給系統Gtk#的支援了.然後我們下載MonoDevelop的msi檔案,解開之後可以看到結構,如:
不錯,只有2個目錄,分別是程式和外掛程式的目錄,這時候我們進到bin目錄,並沒有發現主程式執行程式,想來確實奇怪,為何直接解開會不見了這個檔案,不過這不是問題,我們可以考慮提取安裝後的執行檔案或者自己編譯一個主程式,這個主程式也只是一個簡單的入口,通過查看源碼,可以得到主程式的源碼為:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using Mono.Addins;
using MonoDevelop.Core;
using MonoDevelop.Ide.Gui;
namespace MonoDevelopRunner {
class Program {
static int Main(string[] args) {
bool flag = false;
do {
try {
Runtime.SetProcessName("monodevelop");
IdeStartup startup = new IdeStartup();
return startup.Run(args);
} catch (Exception exception) {
if (!flag) {
LoggingService.LogWarning("MonoDevelop failed to start. Rebuilding addins registry.");
AddinManager.Registry.Rebuild(new ConsoleProgressStatus(true));
LoggingService.LogInfo("Addin registry rebuilt. Restarting MonoDevelop.");
flag = true;
} else {
LoggingService.LogFatalError("MonoDevelop failed to start. Some of the assemblies required to run MonoDevelop (for example gtk-sharp, gnome-sharp or gtkhtml-sharp) may not be properly installed in the GAC.", exception);
flag = false;
}
} finally {
Runtime.Shutdown();
}
}
while (flag);
return -1;
}
}
}
編譯這個程式,就可以作為Monodevelop的主程式了.
將編譯或者提取的主程式放入bin目錄,然而這時候並不能執行主程式,如果查看錯誤資訊,會發現系統提示缺少了gtksharp的支援檔案,最簡單的方式,將gtk#的支援dllcopy到bin目錄中,所需的檔案有:
這些檔案都可以在gtk#的lib,lib/gtk-sharp-2.0,lib/Mono.Posix等目錄找到.將這些檔案也copy到bin目錄,再次執行主程式,發現已經可以運行了,進去測試測試,卻發現在開啟建立項目的時候會出現系統異常,提示pango-sharp無法載入,可是我們明明已經把該dll放入bin檔案夾了,為何呢?經過尋找,終於發現,出現異常的程式集為libstetic,該程式集會顯示載入pango-sharp2.8.0的程式集,但是,我們下載最新的Gtk#提供版本為2.14.0,正是這樣才導致了載入錯誤,因此,我們需要將libstetic的源碼checkout出來,修改該部分的配置,重新編譯即可(文章下方將提供重新編輯的程式集).修改過該libstetic之後,終於沒有異常了,
接下來我們測試下建立一個Gtk#程式,發現到了版本支援的時候Gtk#的版本為空白,經過檢查,這正是我們不是使用gtk#的安裝包,而是綠色包的緣故,導致gtk#支援程式集未到gac註冊,而monodevelop檢查gtk#版本會只檢查gac的版本,從而導致無法得到正確的版本號碼,要解決這個問題,我們需要修改註冊表,添加缺失的資訊,假如gtk#運行庫所在的目錄為E:\gtk#,那麼可以使用如下註冊表檔案來進行修改,如果在其他目錄,則只需要修改路徑:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Novell]
[HKEY_LOCAL_MACHINE\SOFTWARE\Novell\GtkSharp]
[HKEY_LOCAL_MACHINE\SOFTWARE\Novell\GtkSharp\InstallFolder]
@="E:\\gtk#\\"
[HKEY_LOCAL_MACHINE\SOFTWARE\Novell\GtkSharp\Version]
@="2.12.9"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\AssemblyFolders\GtkSharp]
@="E:\\gtk#\\lib\\gtk-sharp-2.0"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\AssemblyFolders\MonoCairo]
@="E:\\gtk#\\lib\\Mono.Cairo"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\AssemblyFolders\MonoPosix]
@="E:\\gtk#\\lib\\Mono.Posix"
匯入該檔案,再次建立Gtk#程式,發現一切正常,至此,一個綠色的Monodevelop程式就建立成功,在不同平台上,只需要修改path和註冊表中gtk#路徑就可做到直接執行Monodevelop.
文章最後提供重新編譯的libstetic程式集
點擊下載此檔案