本文轉自: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.0(net3.5增加了新功能,核心還是2.0,所以2.0就足夠運行了),如果有,就直接運行了,就不使用虛擬機加載了。
然後debug沒有什麼錯誤之後,release下,
然後把飛信的一些東東“借”過來用了哈,文件在D:/Program Files/China Mobile/Fetion/VMDotNet/v2.0.50727(把這個目錄下的文件全部考走)
然後把這些文件和release的exe放到一起。
這些工作完成後,就可以進行打包了
第一想到的就是用vs08中的安裝部署進行打包,Build一次到同學那未安裝.net的機子試了下後,發現不行,提示安裝.net,
因爲.net在安裝部署時會自動檢測“依賴項”,由於我需要加載的net程序依賴於.net平臺,
所以微軟強制了這個“依賴項”(感覺微軟應該把這個強制給刪了,雖然強制有一定的好處,但是提供選擇豈不是更好),
無奈,只有想別的方法去打包,然後想用InstallShield來打包,於是找來vc6的安裝盤把這個裝了下,由於沒用過,就問了下同學,
同學說需要專門的語言來寫點東西,啊啊,現在很急着用,所以再次放棄,到網上去淘那些“傻瓜”式的打包軟件,
嘎嘎,找個了Setup2Go的打包軟件,很好用哈,(有想要的直接baidu這個軟件名,N多鏈接),很快的,打包完畢,Perfect!^_^
到了個未安裝.net的機器上測試了下,完全沒問題哈,只是使用虛擬機來加載時可能打開時會有2秒左右的延遲,嘎嘎,要稍等,
不過已經很好了哈,恩恩,安裝包文件10M左右,對比過去單個exe的80Kb來說是大了不少,不過這樣對於一個不想裝190多M的.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