最让.NET程序员苦恼的是,辛辛苦苦写出来的.NET程序,需要客户机上安装了.NET才能运行。仅为一个小小的应用程序去下载上百兆的.NET安装包,还得把它老老实实安装到客户机上,并占掉数百兆磁盘空间,这无疑是一件得不偿失的事情。.NET程序的这个弱点,也是影响.NET应用程序普及和价值的一个重要因素。
<wbr><wbr>
所谓“独立运行”,是指.NET应用程序脱离完整的.NET运行环境,像c语言编译的程序那样,在操作系统上直接运行。简单地说就是:客户电脑无需安装任何版本的.NET框架,你的.NET程序照样可以在他的电脑或服务器上运行。</wbr></wbr>
<wbr><wbr>
.NET程序独立运行的基础是mono运行时以及它的程序集。mono是什么呢,mono是一款开源、免费、可定制的跨平台.NET运行环境,同时,它还包含了一系列具有重要意义的实用工具,当前最新的版本号是3.0.10,本文所采用的mono,即是这个版本号的windows版。</wbr></wbr>
<wbr><wbr>
那么,到底怎么才能让你的.NET程序无障碍地在没有安装.NET平台的客户机“独立运行”呢,下面直奔主题。</wbr></wbr>
一,建立跨平台的.NET环境与编译环境:
<wbr><wbr>
1、下载并安装mono的windows版,建议将它安装到c:\mono文件夹中。</wbr></wbr>
<wbr><wbr> 2、安装cygwin。</wbr></wbr>
<wbr><wbr><wbr><wbr>A、建议将它安装到c:\cygwin文件夹中。</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>B、安装时,请将mingw-gcc、mingw-zlib、pkg-config、libiconv这几个组件选上,这是将.NET程序转化为本地程序的必要的编译环境。</wbr></wbr></wbr></wbr>
二,启动cgywin并设置环境变量:
<wbr><wbr>
1、点击开始菜单或桌面上的cygwin图标,启动且进入cygwin环境。</wbr></wbr>
<wbr><wbr>
2、输入下面的命令,设置或修改必要的环境变量:</wbr></wbr>
<wbr><wbr><wbr><wbr>export
PKG_CONFIG_PATH=/cygdrive/c/mono/lib/pkgconfig</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>export PATH=$PATH:/cygdrive/c/mono/bin</wbr></wbr></wbr></wbr>
三,将你的.NET程序转化为“独立程序”
请注意,这是本文的关键所在,很多地方的操作都有别于其它网文和mono官网所介绍的操作技术。
1,复制文件。把需编译的.NET
EXE文件和对应的DLL文件复制到你在cygwin的工作文件夹中,如果你的windows用户名是xyz,那么这个文件夹就是
c:\cygwin\home\xyz\,(这一步不是必须的,如果你不怕麻烦而愿意多打字的话)。
2,转换与打包。通过下面的命令,将.net程序和类库打包并得到一个c程序源码(假设你需要转换的.NET文件是a.exe)。
<wbr><wbr> mkbundle -c -o b.c -oo
b.o a.exe -z</wbr></wbr>
<wbr><wbr> 或者:</wbr></wbr>
<wbr><wbr> mkbundle -c -o b.c -oo
b.o a.exe aa.dll c:\\mono\\lib\\mono\\4.5\\mscorlib.dll -z</wbr></wbr>
<wbr><wbr> 或者:</wbr></wbr>
<wbr><wbr> mkbundle -c -o b.c -oo
b.o --dept a.exe -z</wbr></wbr>
3,修改得到的c文件:
<wbr><wbr> 这是本文的精华所在。</wbr></wbr>
<wbr><wbr> 为什么要修改这个c文件,很简单:</wbr></wbr>
<wbr><wbr>
A,不希望与exe文件相关的类库全部打包到一个文件中,否则,太浪费,而且影响启动速度。</wbr></wbr>
<wbr><wbr>
B,这个c文件是目标程序的关键文件,我希望在中间加上自己的东西,让我的程序如虎添翼。</wbr></wbr>
<wbr><wbr>
C,我程序要在中文、日文这样的含有非英文字母的文件夹中运行。</wbr></wbr>
3.1,需要添加和修改的内容:
<wbr><wbr>
A,用VS或记事本打开b.c,把下面的代码复制到main函数之前,作一个准备。</wbr></wbr>
<wbr><wbr> #include</wbr></wbr>
<wbr><wbr> #include
"/usr/include/iconv.h"</wbr></wbr>
<wbr><wbr> int gbk_utf8(char
*inbuf,int inlen,char *outbuf,int outlen){</wbr></wbr>
<wbr><wbr><wbr><wbr> iconv_t cd;</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr> char **pin = &inbuf;</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr> char **pout = &outbuf;</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr> cd = iconv_open("utf-8","gbk");</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr> if (cd == 0) return -1;</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr> memset(outbuf, 0, outlen);</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr> if (iconv(cd, pin, &inlen, pout,
&outlen) == -1) return -1;</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr> iconv_close(cd);</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr> return 0;</wbr></wbr></wbr></wbr>
<wbr><wbr> }</wbr></wbr>
<wbr><wbr>B、在main函数中,找到下面这两行并注释或删除掉:</wbr></wbr>
<wbr><wbr>if (config_dir != NULL
&& getenv ("MONO_CFG_DIR") == NULL)</wbr></wbr>
<wbr><wbr><wbr>
mono_set_dirs (getenv ("MONO_PATH"), config_dir);</wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr><wbr>C、接着,就在这行下边,即“mono_mkbundle_init”一行之前,输入下边的代码:</wbr></wbr>
<wbr><wbr> const char* lib =
"\\lib";</wbr></wbr>
<wbr><wbr> const char* etc =
"\\etc";</wbr></wbr>
<wbr><wbr> char
p[strlen(argv[0])];</wbr></wbr>
<wbr><wbr>
wsprintf(p,"%s",argv[0]);</wbr></wbr>
<wbr><wbr> int l = 0;</wbr></wbr>
<wbr><wbr> l = strlen(p);</wbr></wbr>
<wbr><wbr> for(i=l-1; i>0;
i--){</wbr></wbr>
<wbr><wbr><wbr><wbr> if(p[i] == '\\'){</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr> p[i] =
'\0';</wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr>
break;</wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr> }</wbr></wbr></wbr></wbr>
<wbr><wbr> }</wbr></wbr>
<wbr><wbr> l = strlen(p) +
strlen(lib);</wbr></wbr>
<wbr><wbr> char s_lib[l];</wbr></wbr>
<wbr><wbr> wsprintf(s_lib, "%s%s",
p, lib);</wbr></wbr>
<wbr><wbr> l = strlen(s_lib);</wbr></wbr>
<wbr><wbr> char* s_lib_utf8 =
(char*)malloc(l*2);</wbr></wbr>
<wbr><wbr> memset(s_lib_utf8, 0,
l*2);</wbr></wbr>
<wbr><wbr> gbk_utf8(s_lib, l,
s_lib_utf8, l*2);</wbr></wbr>
<wbr><wbr> l = strlen(p) +
strlen(etc);</wbr></wbr>
<wbr><wbr> char s_etc[l];</wbr></wbr>
<wbr><wbr> wsprintf(s_etc, "%s%s",
p, etc);</wbr></wbr>
<wbr><wbr> l = strlen(s_etc);</wbr></wbr>
<wbr><wbr> char* s_etc_utf8 =
(char*)malloc(l*2);</wbr></wbr>
<wbr><wbr> memset(s_etc_utf8, 0,
l*2);</wbr></wbr>
<wbr><wbr> gbk_utf8(s_etc, l,
s_etc_utf8, l*2);</wbr></wbr>
<wbr><wbr>
mono_set_dirs(s_lib_utf8, s_etc_utf8);</wbr></wbr>
<wbr><wbr>
接着在mono_mkbundle_init一行之后加入一行:</wbr></wbr>
<wbr><wbr> chdir("c:\\");</wbr></wbr>
<wbr><wbr> 最后,找到下面三行</wbr></wbr>
<wbr><wbr> #ifdef _WIN32</wbr></wbr>
<wbr><wbr> #include</wbr></wbr>
<wbr><wbr> #endif</wbr></wbr>
<wbr><wbr> 并在“#endif”后加入一行:</wbr></wbr>
<wbr><wbr> #undef _WIN32</wbr></wbr>
<wbr><wbr> 改完了,存盘退出。</wbr></wbr>
<wbr><wbr>
(有人会说“输入这么多,为什么不写个函数以方便我将来复用?”,我说,这不是我的事。)</wbr></wbr>
3.2,编译:
<wbr><wbr>
用下面这个命令生成你的目标文件“b.exe”。</wbr></wbr>
<wbr><wbr> gcc -mno-cygwin -o b.exe
-Wall b.c `pkg-config --cflags --libs mono-2|dos2unix` b.o -lz
-liconv</wbr></wbr>
四,程序、类库、配置文件的组织:
<wbr><wbr>
这一步,是为你的程序安一个家,让它真的能跑起来。</wbr></wbr>
<wbr><wbr>
1,在某个盘,比如D盘,建个文件夹,比如是“myapp”</wbr></wbr>
<wbr><wbr>
把刚才编译得到的目标文件b.exe复制到D:\myapp文件夹中。</wbr></wbr>
<wbr><wbr>
同时把c:\mono\bin\文件夹中的mono-2.0.dll、zlib1.dll、iconv.dll复制到d:\myapp中。</wbr></wbr>
<wbr><wbr> 2,组织类库</wbr></wbr>
<wbr><wbr>
在“d:\myapp”文件夹中,建lib和etc两个子目录。</wbr></wbr>
<wbr><wbr>
在lib文件夹中,建名叫“mono”的文件夹。</wbr></wbr>
<wbr><wbr>
在d:\myapp\lib\mono文件夹中,根据你.NET程序集版本号建一个文件夹,名字就是版本号,比如“4.5”,当然,你也可以把2.0、4.0也建好。</wbr></wbr>
<wbr><wbr>
如果你没有将mscorlib.dll打包到.EXE中,请将c:\mono\lib\mono\4.5\mscorlib.dll,复制到
d:\myapp\lib\mono\4.5这个文件夹中。</wbr></wbr>
<wbr><wbr>
在d:\myall\lib\mono文件夹中,建一个名为gac的文件夹,这个文件夹是用来放你的程序需要的mono版.NET类库的。</wbr></wbr>
<wbr><wbr>
放些什么?放你的exe、dll文件中引用到的那些程序集的库文件(如果你已经把这些文件打包到了.exe中,那么你就不需要放任何文件)。</wbr></wbr>
<wbr><wbr>
比如,你引用了System名字空间,那么,将c:\mono\lib\mono\gac文件夹下的System文件夹复制到D:\myapp\lib\mono\gac中就行了。</wbr></wbr>
<wbr><wbr> 3,组织配置文件</wbr></wbr>
<wbr><wbr>
把c:\mono\etc文件夹中的“mono”文件夹复制到d:\myapp\etc文件夹中。</wbr></wbr>
<wbr><wbr>
用写字版打开config文件,找到并删除下列三行:</wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr><wbr>
通过上面的几个步骤,你的程序已经变成了可以独立运行的程序了,你把d:\myapp这个文件夹压缩打包,然后解压到没有安装.net的电脑上,试试。</wbr></wbr>
相关推荐
《实战C#.NET编程——Spring.NET & NHibernate从入门到精通》是一本深入探讨C# .NET开发领域中两个重要框架的专著。Spring.NET和NHibernate分别是.NET平台上的轻量级应用程序框架和流行的对象关系映射(ORM)工具,...
北大青鸟ACCP4.0 .Net企业级应用开发– Asp.Net& WebService 课件.part2
安装前请确定已经安装 .net环境,32位系统将TeeChart2011.ocx放在System32,64位系统放在SysWOW64文件加下,通过该文件夹下的cmd.exe 执行regsvr32 + 控件的路径+文件名进行注册
C#程序脱离.net框架的多种方法与应用一步之遥
《实战C#.NET编程-Spring.NET & NHibernate从入门到精通》是一本深入探讨C# .NET平台下Spring.NET和NHibernate两个关键框架的实践指南。这本书旨在帮助开发者从基础知识开始,逐步掌握这两个强大的工具,从而提升...
标题“C#脱离.NET”指的是使用C#编程语言编写的程序不再依赖于.NET Framework即可运行的能力。这通常通过使用.NET Core或.NET 5及更高版本实现,这些版本是跨平台的,并且可以在不安装完整.NET Framework的环境中...
Microsoft Visual C# .NET .NET Common Language Runtime V1.0 支持平台 WIN 98/NT/2000/XP 标准报价 27,590 元人民币 * 以上报价仅供参考,具体以厂商正式报价为准。 电话 021-58549800 Email: tools@sh....
《实战C#.NET编程----Spring.NET & NHibernate从入门到精通》代码 版本:V0.50 BoolsSample 项目代码 NHibernateSample 项目代码 SpringSample 项目代码 SpringNhibernateSample 项目代码 这个是代码部分 pdf我也...
《实战C#.NET编程——Spring.NET & NHibernate从入门到精通》是一本专注于C# .NET平台下使用Spring.NET和NHibernate两个框架进行开发的实战指南。这本书旨在帮助读者掌握这两种强大的工具,从而提升在.NET环境下的...
然而,“C#虚拟机-脱离.NET框架运行exe”这个主题探讨的是如何在没有.NET Framework的情况下运行C#程序,这涉及到一个名为CoreCLR的组件,它是.NET Core的一部分。 .NET Core是微软推出的一个开源、跨平台的开发...
这里要介绍的方法是直接利用飞信的框架来实现脱离 .Net framework运行。 首先下载一个飞信的程序安装。在安装目录中会有 VMDotNet 目录。这个就是.Net框架虚拟环境需要的文件。 直接把整个目录提取出来。 如何利用...
30个计算机项目设计源码&基于asp.net&Java&Android&JSP&C#等设计 音乐网站&电影播放网站&教务选课管理系统&学籍管理系统&网上考试系统&工资管理系统&家庭财务管理系统&微信聊天系统等
标题中的"C#程序脱离.Net framework运行"涉及到一个关键的技术概念,即.NET Core或.NET 5及以上版本的跨平台能力。传统的C#程序依赖于特定版本的.NET Framework运行时环境,这个环境只在Windows系统上可用。然而,...
此为《C#与.NET 4高级程序设计:第5版》中文版一书的源码。 Amazon超级畅销书,权威新版王者归来 全面涵盖C# 2010,用IL深入揭示语言特性 多位微软MVP联手翻译,名著佳译相得益彰 本书是C# 领域久负盛名的经典著作...
C#与.NET+4高级程序设计(第5版).pdf,由于书太大,分成二卷下载!完整版
标题中的"C#脱离.NET环境,飞信虚拟机,.net framework 2.0"暗示了我们正在探讨如何在不依赖传统的.NET Framework 2.0环境下使用C#编程语言,以及可能涉及的飞信虚拟机技术。这个话题对于理解C#语言的可移植性和.NET...
C#/.NET【新阁教育】C#.NET全栈开发高级VIP班 网盘 开发 .NET C# .Net Core
C#.net屏保设计C#.net屏保设计C#.net屏保设计C#.net屏保设计C#.net屏保设计C#.net屏保设计C#.net屏保设计C#.net屏保设计C#.net屏保设计C#.net屏保设计C#.net屏保设计C#.net屏保设计C#.net屏保设计C#.net屏保设计C#...
北大青鸟ACCP4.0 .Net企业级应用开发– Asp.Net& WebService 课件.part1
新闻系统 基于C# asp.net 新闻系统 基于C# asp.net 新闻系统 基于C# asp.net 新闻系统 基于C# asp.net 新闻系统 基于C# asp.net 新闻系统 基于C# asp.net