无需.NET Framework环境运行.NET编写的软件

.NET 开发效率高, 大行其道. 但却一直存在一个比较头疼的通病, 需要安装 .NET Framework, 尤其是.NET 2.0开发的软件. Windows XP 和 Windows 2003 默认都没有.NET 2.0 运行环境. 特别是一些精简版, 譬如"番茄花园"之类的版本, 连.NET2.0都装不上. 现在我们利用移动飞信的原理, 来解决以上的问题.

 

 

1. 安装完移动飞信2008后, 一般我们在 C:/Program Files/China Mobile/Fetion/ 目录里可以看到今天关键的主角:

 

Fetion.exe 启动飞信时首先会先运行这个程序, 用来检测本机是否有.NET环境, 如果有则运行FetionFx.exe, 如果没有则调用VMDotNet这个文件夹里的(v2.0.50727/FetionVM.exe)这个虚拟环境来处理.

 

FetionFx.exe 飞信真正的主程序, 需要.NET 2.0环境.

 

VMDotNet  .NET2.0虚拟运行环境, 支持的版本为2.0.50727.

 

 

2. 介绍完这三个主角后, 我们来看一个简单的实例: 在一个没有安装过.NET 2.0的系统里, 把VMDotNet复制到D盘, 再复制一个你自己编写的.NET程序, 比如Test.exe, 放在D盘. 然后在开始菜单里的"运行"输入以下命令:

 

D://VMDotNet/v2.0.50727/FetionVM.exe D://Test.exe

 

你会发现神奇的事情出现了, Test.exe正常运行.

 


3. 你开始会有疑问了, 我如何像飞信那样直接运行, 而不是通过命令行呢?

 

1) 利用Fetion.exe来加载, 那样的话, 就需要把你自己的主程序改名为FetionFx.exe

 

2) 自己编写一个Win32程序来处理加载过程. 以下是详细步骤.

 

a) 在VS 2005/2008 里, 新建一个C++ Win32程序, 命名为XStart.

b) 在项目的源文件里找到XStart.cpp, 打开后找到里面的函数InitInstance代码, 并加入关键代码的处理.

c) 编译完成, 把XStart.exe复制到Test.exeVMDotNet所在的目录, 运行XStart.exe, 大功告成!!!

 

 

  1. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  2. {
  3.    HWND hWnd;
  4.    hInst = hInstance; // 将实例句柄存储在全局变量中
  5.    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  6.       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
  7.    if (!hWnd)
  8.    {
  9.       return FALSE;
  10.    }
  11.    nCmdShow = SW_HIDE;
  12.    ShowWindow(hWnd, nCmdShow);
  13.    UpdateWindow(hWnd);
  14.     //===========我们加入的代码开始==============
  15.    using namespace std;
  16.    bool started = false;
  17.    try
  18.    {
  19.     char * args = (char*)lpArguments;
  20.     if(strcmp(args, "*") == 0)
  21.     {
  22.      ::Sleep(3000);
  23.     }
  24.     TCHAR path[1024];
  25.     GetSystemDirectory(path, 1024);
  26.     wcscat_s(path, _T("//mscoree.dll"));
  27.     fstream _file(path, ios::in);
  28.     if(!_file)
  29.     {
  30.      //没有找到 mscoree.dll
  31.      ::WinExec("VMDotNet/v2.0.50727/FetionVM.exe Test.exe", SW_SHOW);
  32.      started = true;
  33.     }
  34.     HKEY hkey;
  35.     if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE//Microsoft//.NETFramework//Policy//v2.0"), 0, KEY_READ, &hkey) 
  36.         != ERROR_SUCCESS)
  37.     {
  38.      //没有找到2.0版本
  39.      ::RegCloseKey(hkey);
  40.      ::WinExec("VMDotNet/v2.0.50727/FetionVM.exe Test.exe", SW_SHOW);
  41.      started = true;
  42.     }
  43.     DWORD type = REG_SZ;
  44.     DWORD data = 80;
  45.     if(::RegQueryValueEx(hkey, _T("50727"), NULL , &type, NULL, &data) != ERROR_SUCCESS)
  46.     {
  47.      //没有找到2.0.50727版本
  48.      ::RegCloseKey(hkey);
  49.      ::WinExec("VMDotNet/v2.0.50727/FetionVM.exe Test.exe", SW_SHOW);
  50.      started = true;
  51.     }
  52.     if(!started)
  53.     {
  54.      //直接运行
  55.      ::RegCloseKey(hkey);
  56.      ::WinExec("Test.exe", SW_SHOW);
  57.     }
  58.    }
  59.    catch(...)
  60.    {
  61.     ::MessageBox(hWnd, _T("Sorry! Start program failed. /r/n/r/n对不起,程序启动失败!"), _T(" 启动失败 "), MB_ICONERROR);
  62.    }
  63.    ::ExitProcess(0);
  64.     //=============我们加入的代码结束==============
  65.     return TRUE;
  66. }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值