随着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程序集
点击下载此文件

posted on 2009-06-16 01:53  Leven  阅读(5039)  评论(1编辑  收藏  举报
CopyRight 2008, Leven's Blog xhtml | css
Leven的个人Blog