.NET在今天来说已经算是比较普及了,开发程序的时候,我也一直要求用户安装.NET框架,不过这个不会特别好,所以想做一些脱离.NET框架的东西。一直想做这个事情,不过一直没有做成,今天有点空写一下如何实现.NET应用程序脱离.NET环境运行,我们首先说一下.NET应用程序脱离.NET环境运行的实现方法,目前来说比较好用的方法有3种。
- 使用飞信虚拟环境。
- 使用MONO.NET。
- 使用.NET Linker。
首先说第一种,我们都知道飞信是C#开发的(我一个朋友还有源代码),但是不需要.NET环境,因为飞信用了虚拟环境,我们也可以用飞信的虚拟环境,不过比较麻烦,而且启动速度比较慢,而且还有版权问题。第二种是最好的方式,不仅启动速度比较快,而且还跨平台,支持Linux和Unix以及Mac OS,虽然那上面的.NET程序需求不高,但是如果做的产品好的话,还是不错的。最后一种不是很复杂,但是要破解,也有版权问题,启动速度比较慢。
所以这里我们就说MONO吧,MONO我相信大家都比较熟悉了,一个让.NET跨平台的公司,可惜微软赞助支持的不是很好,因为微软就只抱着Windows的态度,不过MONO还不错,坚持下来并且拉到了微软的赞助。现在的MONO已经对.NET 2.0支持的比较成熟,3.5也支持一些,但不是很多,反正国内环境来说2.0比较成熟,就用2.0也行。
首先我们下载一个MONO。下载完成后安装(这不是废话),安装到一个文件夹之后,比如D盘,就到D盘找到你安装的路径。
现在我们写一个.NET程序,写个最简单的命令行的吧,测试一下,我们拷贝到安装的路径下面,然后运行下面的代码。
上面的appname是你的应用程序名称,OK,看看,是不是可以运行了,这个就是用MONO提供的程序跑.NET框架。
不过现在看上去比较大,我们可以精简一下,我们首先把程序拷贝到一个干净的目录里面,然后我们再把安装路径下的bin和lib拷贝到这个目录里。那么这个目录就有我们的程序,MONO的bin目录和MONO的lib目录,看看大小,嗯,300多M,太大了,所以我们得精简一下。
我们首先精简bin目录,bin只需要保存下面几个文件就可以了。
- mono.dll
- libgthread-2.0-0.dll
- libglib-2.0-0.dll
- intl.dll
- iconv.dll
- mono.exe
除了上面的文件以外我们都可以删除掉,然后我们到lib目录里(这里我是一个一个测试删除的。。=。=!),保留下面的文件就可以了。
- mono文件夹
mono文件夹里面保留这些文件,如果你要使用多个版本的话,比如2.0和3.5的特性,可以保留相应的文件夹,这里我保留了2.0,3.5和gac,其中2.0和gac是必须的。
我们在2.0目录里面只需要保留以下文件。
- Accessibility.dll
- mscorlib.dll
- mscorlib.dll.mdb
其他的可以狂删,在gac目录里面,我们只需要保留下面这个文件夹就可以了。
- Boo.Lang
我们再来压缩一下我们的程序,程序大小才8m,可以接受了。
这里值得一提的是,我们在不同的平台里面可以使用不同的C++程序来启动我们的程序(即运行\\bin\mono.exe appname.exe),代码如下。
{
WinExec("bin\\mono.exe appname.exe",SW_SHOWNORMAL);
return 0;
}
不同的平台可能C++代码不同,不过有另外一个比较好的方法,就是写批处理文件,这样的话无论在Windows里面还是在Linux里面,启动起来都比较容易,至少比写几个C++程序要简单的多吧。