本文介绍的是C#编写的winform程序脱离.net框架的方法。【也支持VB.NET和C++.NET】
原文地址:http://hi.baidu.com/44498/blog/item/dabd37166a11bd10962b437d.html
很多朋友会问,为何选择C# ?其实原因很简单,因为它具有其他任何语言都不具备的生产力。
软件工程的发展,主要目的也就是提高生产力,这个核心不变,我们的学习方向也就不变。
本文代码示例支持.NET FRAMEWORK 2.0 ,3.0 , 3.5 ,LINQ等先进的解决方案。
一看就懂,一学就会,一目了然。。。
以下所有例子,均经过测试,在2k,xp,2003,vista,2008,Win7下都是可以运行的。也包括X86和X64平台。
声明:本文讲解的是解决方案,并不提供下载【主要是没有稳定的网盘】,
---------------------------------------------------------
1, .Net Linker :中国移动的飞信就利用了它的核心。飞信是使用C#在.NET上开发的。贵,最便宜的版本要1000多美金。【傻瓜式操作,这里不做介绍】
2,用飞信的虚拟机来引导自己开发的.NET程序。
3,使用mono来达到脱离.NET框架的效果,可以跨平台。【完美支持.net2.0,以及绝大多数.NET3.5,目前已经支持WPF系列新技术了】
///////////////////////实验过程/////////////////////////
例子1:先说最简单的,使用飞信虚拟机来试验吧。
【不要引用VB编写的控件或者是类库,因为飞信的虚拟机功能很少】
先安装"飞信2008 3.5版",然后打开安装目录,里面有个VMDotNet文件夹,里面就是.NET虚拟环境相关文件了,找到飞信安装目录下的"VMDotNet\v2.0.50727\FetionVM.exe"来启动运行我们的.NET WinForm程序:
【可以使用命令行来传值也可以用其他方式,都是一样的】例如:
WinExec("FetionVM.exe 我的程序.exe", SW_SHOW); //C++ code
为了方便,我们可以编写一个检测.net框架版本的程序作为引导程序,如果已经安装了.net框架就不用虚拟机,如果没有安装,调用虚拟器来启动程序。【请不要使用C#或者其他托管类型的语言来编写这个引导程序,否则失去了意义】。
很容易吧?但是有个弊端,你的.NET程序如果要操作类似于SQL SERVER2000,2005,2008 或者是MYSQL,Oracle,DB2等数据库,用这个飞信自带的虚拟机实现就比较麻烦,所以这个飞信的虚拟机只能做简单的程序应用。还有一点大家要注意,使用飞信的虚拟机,涉及到的还有版权问题。测试一下,压缩以后文件大概是6,7M左右,还行。
例子2:使用MONO来脱离框架并且跨平台。注:测试结果显示,使用MONO启动.NET程序速度是最快的。
首先到MONO的官方网站下载源代码或者最新版本,然后安装,我用的是2.2版本【目前已经有2.4版本了,比较新,支持的更多】。
为了方便各位朋友试验,我提供我本次试验的MONO版本2.2 :
下载地址:
安装完毕,打开目录,找到两个子目录,名字分别是bin,lib ,然后复制到另外一个目录里面去【因为安装的时候默认安装在C盘的】然后把你的.net开发的程序也复制到这个目录里面去;假设这个目录名字叫做VM,那么你的这个文件夹里应该有个最少三个文件,一个是bin文件夹,一个是lib文件夹,还有一个就是你写的.net程序了。
然后可以用C++编写一个引导程序用来调用你的.NET程序;贴个简单的代码吧:
int main()
{
WinExec("bin\\mono.exe 你的应用程序.exe",SW_SHOWNORMAL);
return 0;
}
当然,为了方便,你可以自己在逻辑里面判断一下,机器里安装的是.NET的哪个版本?如果版本低了,就调用MONO来执行,如果匹配,就不调用MONO了。
【这个例子只是支持简单的WINFORM和数据库访问,WEBSERVICE的,在文章末尾】
如果按照我说的一路操作,肯定是可以运行的了,但是你会发现,现在你的.NET程序是一个绿色软件,但是他所在的目录下lib,或者是bin文件夹的大小是非常恐怖的。。。有300M以上的大小,这岂不是和我们的想法冲突了?当然不是;我们来精简目录吧:
在bin目录下,保留以下文件,其他的删除即可
然后打开lib文件夹,在2.0文件夹下保留Accessibility.dll,mscorlib.dll,mscorlib.dll.mdb,然后在GAC文件夹里面保留以下文件夹【下图中的类库全部保留,最好不要删除】:
这样,整个目录就精简的差不多了,当然,你可以根据自己的需要定制需要的各种类库。然后打包即可,以我本人机器为例,压缩后的文件是9.8M,比.NET 2.0的框架小了很多,但是比飞信的那个虚拟机还是大了一些;换个角度来看,用mono不涉及版权问题,也可以调用各种数据库,我本机测试操作的是SQL SERVER 2005数据库,一切正常。让你的.NET程序也跨平台吧!只有MONO能做到这一点。
本文原创,抄袭的别太过分哦,最起码也专业点,别图片都不贴就发布,
耽误别人学习,那才是最大的犯罪。。。
例子3:使用.Net Linker 的一个老版本来测试的
通过命令行来提取.net环境的一些类库文件,然后模拟,不知道飞信用的是哪个版本,反正我这个老版本是不太好用,要手动精简目录的。
但是唯一的好处就是兼容性比较好,而且不限制数据库的使用。这个也涉及到版权问题,就不啰嗦了。
精简后的文件大小是8.66M,一般的应用都可以满足了,呵呵。
好了,时间不早了,睡觉了。欢迎大家留言,提出各种不同的见解。
更新:2009年3月30日
抽空拿到了.Net Linker 的破解版,用了一下还是不错的,稳定性很好,兼容多种数据库。美中不足的是有了MONO的比较,用.net linker虚拟机以后,程序启动的时候速度稍微慢了一点,和飞信的启动速度一样。。。不过这也没办法,忍了。
更新:2009年4月14日 支持web service
今天看到一个朋友咨询MONO平台上调用webservice的问题;事实上,MONO是完全支持web service的 ;我这里也做个示例吧。
新建一个项目,winform的,版本是.net2.0;然后添加一个引用,引用我们准备好的web服务。
引用的url:http://www.ayandy.com/, 这个web服务的功能是天气预报那种的,包括国内外400多个主要城市。【如果图片不清晰,可以保存到本地然后查看。】
然后,引用好了,就调用吧~ 我这里例子显示的是北京当天的天气。
然后运行程序:
我的机器上有.net 3.5,当然没问题,但是我们要是在其他机器上呢?
切换到虚拟机里,虚拟机是xp sp2,没有安装.NET任何版本的框架;
把程序复制到mono的目录中,运行之。。。
可以看到,没有任何问题。。。这里用的MONO版本是2.2,支持的很好。
大家可以看到,整个winform程序的按钮,字体样式都做了改变,
因为MONO是在LINUX上的解决方案,没有使用微软默认的字体和样式。
本文偶尔更新,更新时间不确定。感谢大家的关注。。。
有问题可以留言。。。下一篇日志《使用托管C++【c++.net】脱离.NET框架实战》
2009.04.23 更新:
关于有些朋友提出,MONO到底支持多少种数据库的问题,其实MONO支持的数据库绝对比我们想象的多,几乎是很多我们都没有用过的。。。好了,我给个清单,让大家心里有数。最近上网少,资料也没怎么查,就先拿个05年的文章参考一下吧。
Mono Supported Database Access- -
Mono has many ADO.NET Data Providers to get you connected.
Providers for Open Source databases:
PostgreSQL: Npgsql is fully managed provider for PostgreSQL and is actively maintained
SQL Lite: actively maintained. Requires sqlite library.
Firebird Interbase: fully managed provider for Firebird and is actively maintained.
MySQL: use the MySQL Connector/Net from MySQL AB which is fully managed and actively maintained by MySQL AB, but it is not included with Mono. There is the ByteFX.Data.MySqlClient provider which is not actively maintained, but it is included with Mono.
Providers for commercial databases:
IBM DB2 Universal Database Requires DB2 client software
ODBC requires ODBC software which is available for Unix and Windows
Oracle requires client software including Oracle Call Interface
OLE DB Requires libgda (http://www.gnome-db.org/) System.Data.OleDb is not actively maintained plus it only works on Linux with GNOME 2.x
Microsoft SQL Server fully managed provider which is actively maintained for Microsoft SQL Server 7.0/2000/2005 databases
Sybase fully managed provider for Sybase 12.x databases and is actively maintained
Older Microsoft SQL Server and Sybase databases Not actively maintained.
Alternative to ADO.NET is GdaSharp (Gnome Data Access)
Gnome Data Access (http://www.gnome-db.org/) GdaSharp is C# bindings to GDA (GNOME Data Access) and is included with GtkSharp (http://www.mono-project.com/GtkSharp), but it requires libgda be installed. Works only on Linux with GNOME 2.x installed.
External Projects that have created ADO.NET Providers that work on Mono:
MySQL Connector/Net from MySQL AB (http://dev.mysql.com/downloads/connector/net/) is the .NET and Mono data provider for MySQL
ByteFX.Data.MySqlClient (http://sourceforge.net/projects/mysqlnet/) is a MySQL Managed data provider. ByteFX.Data is no longer actively developed, but it is included with Mono. Please use the MySQL Connector/Net provider from MySQL AB instead.
NPgsql (http://gborg.postgresql.org/project/npgsql/projdisplay.php) is a fully managed provider for PostgreSQL and is included with Mono.
Firebird (http://sourceforge.net/projects/firebird/) fully managed provider for Firebird databases and is included with Mono.
Advanced Data Provider (http://advanced-ado.sourceforge.net/) ADP, is a transparent factory for ADO.NET which loads providers dynamically.
Other Projects
DB40 (http://www.mono-project.com/DB4O) Open source object database for C#
2009.05.27 更新
要注意的是,在X86下编译的程序,如果选择ANYCPU,那么提取后的程序可以在X64下运行。
但是,如果是编译的时候选择X64,那就无法通过LINKER提取。