刘辉

刘辉

(被访问167601次)

让.NET Windows Forms程序脱离官方.NET框架运行之最简Mono方案(3mb)

作者:
刘辉
发表于:
2009/8/25 22:25:21
评论:
1
浏览:
1151
RSS:
11

  Mono在不断成长, 现在最新的版本2.2 几乎是可以完整支持WinForms2.0的API了, 最近在园子里无意中翻到了以前一些关于C#程序脱离.NET框架运行的文章, 想老话重提, 看看是否从Mono入手会成为这个话题今后的主流思想.

  通过不断的测试, 精简, 我从Mono框架中分离了可以运行一个基本的WinForms2.0程序所需要的最少的文件. 下面是步骤:

  1. 在http://mono-project.com/ 下载Mono环境并安装好.

  2. 建立工程目录 "helloworld_nondotnet", "helloworld_nondotnetbin", "helloworld_nondotnetlib".

  3. 复制Mono安装目录bin 下面的 "libgio-2.0-0.dll", "libglib-2.0-0.dll", "libgthread-2.0-0.dll", "mono.dll", "mono.exe" 至helloworld_nondotnetbin .

  复制Mono安装目录libmono 下面的 "2.0"目录至helloworld_nondotnetlibmono

  复制Mono安装目录libmonogac 下面的 "Accessibility", "Mono.Posix", "System", "System.Drawing", "System.Windows.Forms"目录至helloworld_nondotnetlibmonogac

  (注意:上面几个全局程序集缓存目录中均包含1.0和2.0两个版本, 我们的目的是运行2.0程序, 因此将里面的1.0目录删掉以节省空间)

  4. 打开VS编写一个示例程序helloworld.exe, 并将此exe放入 helloworld_nondotnetbin ,命令行运行 helloworld_nondotnetbinmono.exe "helloworld.exe", 如果你的helloworld.exe只用到了WinForms库和一些GUI Events的话, Mono环境是可以正常加载运行helloworld.exe的.

  (如果.NET 程序当中调用到一些Windows特定API,例如注册表等, Mono会提示"requested feature is not implemented", 并且程序中那一部分的功能不能正常运行, 即使使用完整版Mono调用也是如此, 暂时没找到解决办法 :( .........)

  现在你可以将工程目录打包发布了, 使用7z压缩后仅3m大小, 如果你的程序无法运行,请先尝试使用完整版Mono调用,如果成功的话, 就逐一尝试将bin和lib目录下面的一些文件Copy到你的工程目录, 应该就没什么问题了.

 

  下面是我做的一个例子在Mono环境下运行和官方.NET环境下的截图和对比:

让.NET Windows Forms程序脱离官方.NET框架运行之最简Mono方案(3mb)

分类:
Web开发

脚印

评论 (1)

  • 匿名用户
    悠哉悠哉
    2010-09-12 09:25

    .NET程序脱离框架进阶 之 Embedding Mono  使用MONO让.NET程序脱离.NET Framework运行是个不错的方法,网上已有很多介绍。但是MONO运行.NET程序也有让人郁闷的地方,比如你只能使用“mono 你的NET程序名.exe”这样的命令运行你的.NET程序(当然,你也可以用C++写个程序来调用。),虽然也不复杂,但是程序运行时MONO黑乎乎的命令行窗口实在碍眼。
      前些日子看了下MONO官方Embedding Mono介绍,于是动手写了个,用起来爽多了,看下面C++代码:
    #include "stdafx.h"
    #include <glib/glib.h>
    #include <mono/jit/jit.h>
    #include <mono/metadata/assembly.h>
    #include <mono/metadata/environment.h>
    #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
    int main(int argc, char* argv[])
    {
       int retval;
       char *file;
       file = ".\\demo.exe"; // .NET程序路径
       //argv[0] = file;
       mono_set_dirs(".\\lib", NULL);
       MonoDomain *domain;
       MonoAssembly *assembly;
       domain = mono_jit_init (file);
       assembly = mono_domain_assembly_open (domain, file);
       if (!assembly) exit (2);
       mono_jit_exec (domain, assembly, argc, argv);
       retval = mono_environment_exitcode_get ();
       mono_jit_cleanup (domain);
       return retval;
    }
      哎,不会写文章,直接上源码下载地址:http://www.xun6.com/file/0dcf46622/EmbeddingMono.zip.html
      压缩包中包含精简过的MONO框架(在Release目录中)仅包含demo所需的组件,所以不适合你的程序,你可以自行下载MONO框架进行精简,这方面网上已有很多文章,我就不再罗嗦了。

注册用户登录才能发表评论,登录注册

日历

<< 2012年5月 >>
  12345
6789101112
13141516171819
20212223242526
2728293031  

最新评论