您的位置:首页 > 其它

如何在没有安装NetFramework的电脑上运行.net程序

2010-03-13 16:41 666 查看
.net程序通常只能在安装了Net.Framework的电脑上运行,如果想在没安装Net.Framework的电脑上运行,就得在打包程序的时候,在“系统必备”对话框里选择“从与我的应用程序相同的位置下载系统必须组件”,自带Net.Framework的安装包到目标电脑上安装。可是这样一来,打包之后的程序包相当庞大,如果是Net.Framework3.5的话,打包之后有220M,即使是最基本的Net.Framework2.0,打包之后也有30M。另外,在目标电脑上安装Net.Framework所用的时间相当漫长,这也让人感到无法忍受。

能不能不安装Net.Framework,就可以在目标电脑上运行.net程序呢?

经过多次实验,我发现这可以的,必须把程序运行时必备的文件带上,并修改目标电脑上的注册表,过程相当复杂。具体方法如下:

第一步:找出程序运行时必备的文件:
绝对必须的文件:
mscorjit.dll, mscorlib.dll, mscorwks.dll,这三个可以在 C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727文件夹里找到,
machine.config,这个文件可以在C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/CONFIG文件夹里找到。
可能须要的文件:看你的程序引用了哪些库,VB.net的话,在 工程——属性——引用页面,点一下“未使用的引用”,然后在弹出对话框中点“移除”,然后看看剩下哪一些,一般而言是System.dll ,System.Drawing.dll 和System.Windows.Forms.dll三个,如果你用到了别的命名空间就会有别的。C#的话,直接看你的using nameapace语句引用了哪些命名空间就行了,或者在“解决方案管理器”里面也可以看到有一项是“引用”。
下面假设你的程序所引用的库为System.dll ,System.Drawing.dll 和System.Windows.Forms.dll。

第二步:把程序运行时必备的文件复制到你的程序所在的目录。
在你的程序所在的目录(如D:/myprogram/release)下新建一个名为“v2.0.50727”的文件夹,然后把mscorjit.dll, mscorlib.dll, mscorwks.dll,System.dll ,System.Drawing.dll 和System.Windows.Forms.dll复制过来,然后在这个“v2.0.50727”目录下建一个名为“CONFIG”的文件夹,把machine.config复制过来。

第三步:(第三步和第四步都是在目标电脑上进行的)
在目标电脑上创建C:/WINDOWS/Microsoft.NET/Framework/文件夹,把上面的“v2.0.50727”目录里面的内容复制到目标电脑上的C:/WINDOWS/Microsoft.NET/Framework/文件夹里面。

第四步:修改目标电脑上的注册表:
在目标电脑的HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/下创建一个名为.NETFramework的子项,然后为此子项添加一个名为"InstallRoot"的键值,其值为"C:/WINDOWS/Microsoft.NET/Framework/"

这样的话,目标电脑上就“好像”安装了Net.Framework,你的程序也就可以运行了。然而,由于第三步和第四步都必须在目标电脑上执行,总不能让目标的主人亲手来完成这些事情吧,为此我编写了一个注册程序,只要把它放到跟你的程序所在的文件夹(如D:/myprogram/release)里面,在目标电脑上双击这个程序,就可以自动完成第三步和第四步。另外编写了一个打包程序,用于自动完成第一步和第二步。

注册程序是一个Win32 APP程序,我把它放在 http://pickup.mofile.com/ href="http://gx007d.mofile.com/7553607396496035/RGlzazIvOTYvOTYzNjkzNjE4Ni83Lzc3Mjc5MjkyMjI4MTI2Nw../regwin32.exe" target=_blank>7553607396496035 (下载链接在这个页面的一个夹缝里),源代码如下:

#include "stdafx.h"
#include "shellapi.h"

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
PHKEY k1=new HKEY;
if(::RegOpenKeyA(HKEY_LOCAL_MACHINE,"SOFTWARE//Microsoft//.NETFramework//v2.0.50727",k1)){
::RegCreateKeyA(HKEY_LOCAL_MACHINE,"SOFTWARE//Microsoft//.NETFramework//",k1);
::RegSetValueExA(*k1,"InstallRoot",0,1,(const BYTE *)"C://WINDOWS//Microsoft.NET//Framework//",64);
::CreateDirectoryA("C://WINDOWS//Microsoft.NET",NULL);
::CreateDirectoryA("C://WINDOWS//Microsoft.NET//Framework",NULL);
::CreateDirectoryA("C://WINDOWS//Microsoft.NET//Framework//v2.0.50727",NULL);
::CreateDirectoryA("C://WINDOWS//Microsoft.NET//Framework//v2.0.50727//CONFIG",NULL);
::SHFILEOPSTRUCTA fs1;
fs1.wFunc=2;
fs1.fFlags=0x80;
fs1.pFrom="v2.0.50727//*.*";
fs1.pTo="C://windows//microsoft.net//framework//v2.0.50727//";
::SHFileOperationA(&fs1);
fs1.pFrom="v2.0.50727//CONFIG//*.*";
fs1.pTo="C://windows//microsoft.net//framework//v2.0.50727//CONFIG//";
::SHFileOperationA(&fs1);
}
::MessageBoxA(0,"注册成功!","注册",NULL);
return FALSE;
}

打包程序是用VB.net写的,我把它放在 http://pickup.mofile.com/1500343945429788窗体有两个按钮,一个文本框和一个CheckedListBox,源代码如下:

Public Class Form1
Dim s0() As String = {"mscorjit.dll", "mscorlib.dll", "mscorwks.dll", "System.dll", "System.Drawing.dll", "System.Windows.Forms.dll"}
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
SaveFileDialog1.ShowDialog()
Dim s1 As String = SaveFileDialog1.FileName
s1 = s1.Substring(0, s1.LastIndexOf("/"c))
TextBox1.Text = s1
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim dr As New DirectoryInfo("C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727")
For Each f As FileInfo In dr.GetFiles("system*.dll")
CheckedListBox1.Items.Add(f.Name)
Next
For Each f As FileInfo In dr.GetFiles("mscor*.dll")
CheckedListBox1.Items.Add(f.Name)
Next
For Each f As FileInfo In dr.GetFiles("microsoft*.dll")
CheckedListBox1.Items.Add(f.Name)
Next
For i As Integer = 0 To CheckedListBox1.Items.Count - 1
For Each s As String In s0
If s = CheckedListBox1.Items(i) Then CheckedListBox1.SetItemChecked(i, True)
Next
Next
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim p1 As String = TextBox1.Text + "/v2.0.50727/"
Dim p2 As String = TextBox1.Text + "/v2.0.50727/CONFIG/"
Directory.CreateDirectory(p1)
Directory.CreateDirectory(p2)
For Each f As String In CheckedListBox1.CheckedItems
File.Copy("C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/" + f, p1 + f)
Next
File.Copy("C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/CONFIG/machine.config", p2 + "machine.config")
End Sub
End Class



原:http://hi.baidu.com/wwbmmm/blog/item/5cec007e340c720e28388a02.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: