C#程序脱离.net框架的多种方法与应用

时间:2023-02-10 14:30:30

本文介绍的是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目录下,保留以下文件,其他的删除即可

C#程序脱离.net框架的多种方法与应用

然后打开lib文件夹,在2.0文件夹下保留Accessibility.dll,mscorlib.dll,mscorlib.dll.mdb,然后在GAC文件夹里面保留以下文件夹:

C#程序脱离.net框架的多种方法与应用

这样,整个目录就精简的差不多了,当然,你可以根据自己的需要定制需要的各种类库。然后打包即可,以我本人机器为 例,压缩后的文件是9.8M,比.NET 2.0的框架小了很多,但是比飞信的那个虚拟机还是大了一些;换个角度来看,用mono不涉及版权问题,也可以调用各种数据库,我本机测试操作的是SQL SERVER 2005数据库,一切正常。让你的.NET程序也跨平台吧!只有MONO能做到这一点。

本文原创,抄袭的别太过分哦,最起码也专业点,别图片都不贴就发布,

耽误别人学习,那才是最大的犯罪。。。

例子3:使用.Net Linker 的一个老版本来测试的

通过命令行来提取.net环境的一些类库文件,然后模拟,不知道飞信用的是哪个版本,反正我这个老版本是不太好用,要手动精简目录的。

但是唯一的好处就是兼容性比较好,而且不限制数据库的使用。这个也涉及到版权问题,就不啰嗦了。

精简后的文件大小是8.66M,一般的应用都可以满足了,呵呵。

好了,时间不早了,睡觉了。欢迎大家留言,提出各种不同的见解。

感觉或者可能存在某种问题或者BUG的,把程序源代码以及需要的组件,打包,压缩,以附件的形式发送到我的邮箱: game@vip.sina.com 可以适当的附带说明文档。
我会抽空调试一下,然后给予回复。

更新: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多个主要城市。【如果图片不清晰,可以保存到本地然后查看。】

C#程序脱离.net框架的多种方法与应用

然后,引用好了,就调用吧~    我这里例子显示的是北京当天的天气。

然后运行程序:

C#程序脱离.net框架的多种方法与应用

我的机器上有.net 3.5,当然没问题,但是我们要是在其他机器上呢?

切换到虚拟机里,虚拟机是xp sp2,没有安装.NET任何版本的框架;

把程序复制到mono的目录中,运行之。。。

C#程序脱离.net框架的多种方法与应用

可以看到,没有任何问题。。。这里用的MONO版本是2.2,支持的很好。

大家可以看到,整个winform程序的按钮,字体样式都做了改变,

因为MONO是在LINUX上的解决方案,没有使用微软默认的字体和样式。