通过FetionVM实现无.net框架环境下运行.NET程序

本文转自:http://hi.baidu.com/flyskymlf/blog/item/1c425259f816552f2834f0ce.html

本来想把用C#写的程序重写移植到win32平台的,但是感觉重写好累,而且不是很熟练,就想着能不能在未安装.net的机器上运行,有需就有求,嘎嘎,百度了一会,已经有各位老大们已经在讨论用飞信的虚拟机平台来进行加载运行.net程序了,于是自己就想着去尝试着去做一下。

PS:飞信的就是在.net平台上开发的,不同的是飞信做了一个.net虚拟机的平台,这样就能在非安装.net的机器上运行了)

开始动手^_^

由于启动文件要在win32上运行,所以就用了VC++6来进行写程序了,使用该启动程序来进行启动外部程序(我们的.net程序)

代码如下

// 文本隔行加亮2.cpp : Defines the entry point for the application.

      #include "stdafx.h"

      int APIENTRY WinMain(HINSTANCE hInstance,
                  HINSTANCE hPrevInstance,
                  LPSTR lpCmdLine,
                  int nCmdShow)
     {
      
// TODO: Place code here.

       
//HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/v2.0.50727

        HKEY hKey;
        LPCTSTR path="SOFTWARE//Microsoft//.NETFramework//v2.0.50727";
       
//打开注册表键,查看系统是否安装了.net Frameworkv2.0

        LONG lResult=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,path,0,KEY_READ,&hKey));
        ::RegCloseKey(hKey);
        if(!lResult==ERROR_SUCCESS)//若不是返回成功
        {
           
//MessageBox(NULL,"由于是用飞信的.net虚拟机加载启动的/n所以启动会有点慢,请稍候几秒钟/n/n请/"确认/"后继续","Hello",MB_OK);

       WinExec("FetionVM.exe 文本隔行加亮.exe", SW_SHOW);
        }
        else
        {
            WinExec("文本隔行加亮.exe",SW_SHOW);
        }
        return 0;
    }

代码不多说了,注释里都有,通过读取注册表看看有没有安装.net2.0net3.5增加了新功能,核心还是2.0,所以2.0就足够运行了),如果有,就直接运行了,就不使用虚拟机加载了。

然后debug没有什么错误之后,release下,

然后把飞信的一些东东“借”过来用了哈,文件在D:/Program Files/China Mobile/Fetion/VMDotNet/v2.0.50727(把这个目录下的文件全部考走)

然后把这些文件和releaseexe放到一起。

这些工作完成后,就可以进行打包了

第一想到的就是用vs08中的安装部署进行打包,Build一次到同学那未安装.net的机子试了下后,发现不行,提示安装.net

因为.net在安装部署时会自动检测“依赖项”,由于我需要加载的net程序依赖于.net平台,

所以微软强制了这个“依赖项”(感觉微软应该把这个强制给删了,虽然强制有一定的好处,但是提供选择岂不是更好),

无奈,只有想别的方法去打包,然后想用InstallShield来打包,于是找来vc6的安装盘把这个装了下,由于没用过,就问了下同学,

同学说需要专门的语言来写点东西,啊啊,现在很急着用,所以再次放弃,到网上去淘那些“傻瓜”式的打包软件,

嘎嘎,找个了Setup2Go的打包软件,很好用哈,(有想要的直接baidu这个软件名,N多链接),很快的,打包完毕,Perfect!^_^

到了个未安装.net的机器上测试了下,完全没问题哈,只是使用虚拟机来加载时可能打开时会有2秒左右的延迟,嘎嘎,要稍等,

不过已经很好了哈,恩恩,安装包文件10M左右,对比过去单个exe80Kb来说是大了不少,不过这样对于一个不想装190M.net库的人来说,很值了哈^_^

顺便说下:想要.net程序完全脱离.net平台是不可能的哈,即使用虚拟机来加载那也毕竟是个.net的虚拟机。

参考文章:对作者表示感谢

http://www.cnblogs.com/XwendotNet/archive/2008/04/06/1138810.html

http://www.cnblogs.com/scottckt/archive/2007/12/14/995258.html

http://blog.csdn.net/wlwqw/archive/2007/09/17/1788113.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
从四年前刚学C#时就一直想找到一种方法可以让.Net程序在未安装framework的电脑上运行,但一直没有找到真正可用的。虽然有些公司发布了可以将.net代码编译成navtive代码以脱离.net环境运行,如Remotesoft DOTNET Linker,Xenocode Postbuild等,但一直没有破解版,用它们编译的程序每次运行会添出个版权信息。最近偶然发现一种方法可以做到真正使程序脱离.net环境运行且没有任何版权信息添出,现将使用方法、源代码、测试程序发布于此: 请首先在文章末尾下载测试程序,是一个用C#做的串口工具,下载解压后有两个文件夹(FrameWork和APP)和一个程序(串口工具.exe),在APP文件夹下有一个名为9527.exe的程序,这个是C#真正的“串口工具.exe”,而主目录下的串口工具.exe只是一个Loader程序,它运行后首先判断电脑上有没有安装framework,若有,则直接启动APP下的9527.exe程序;若无,则通过framework虚拟机(FrameWork下的VM.exe(其实是飞信框架里的FetionVM.exe,修改了它的图标和版权,想改成其它的大家可以用VC改一下,有网友强列要求指出这一点,想不明白为什么,呵呵,让指出就指出吧,还要求指出调用的方法,,其实我连源程序都公布了,用说的这么明白吗))启动9527.exe程序。Loader程序不会打开任何窗口,并在启动真正应用程序后立即退出。Loader程序主函数(VC6.0编写)的代码如下:  主函数: int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { TCHAR fwVersion[VERSION]; if(CheckRegistryKeyExistance(fwVersion)) { if(CompareFWVersions(fwVersion, "2.0"))//最低版本要求2.0 { RunApplication(".\\app\\9527.exe");//直接运行 } else { //应用程序放在APP目录下,要启动的程序的名字为9527.exe, //9527周星弛在《唐伯虎点秋香》的代号,呵 RunApplication(".\\FrameWork\\VM.exe \".\\app\\9527.exe\"");//通过虚拟机运行 } } else { RunApplication(".\\FrameWork\\VM.exe \".\\app\\9527.exe\"");//通过虚拟机运行 } return 0; } 判断是否安装的代码就不贴出来了,可以在文章末尾下载整个VC6的工程文件看。 下面总结一下如何使用: 1. 下载我的例子程序 2. 清空APP下的所有文件 3. 把你自已的.net可执行程序和相关文件全部复制到APP下,并将可执行程序的名字改为9527.exe (不喜欢这个名字可以修改Loader程序重新编译) 4. 把主目录的“串口工具.exe"名字改成任何你想要的名字。(要改图标的话,建议下载我的Loader源程序,修改后重新编译) 大功告成,拿到一台没装.net的电脑上试试吧。祝好运。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值