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

.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/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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了让.Net程序脱离.Net Framework框架运行我试了很多方法,网上说的基本都试过了,最效果都不太理想,最后我还是选择了现在比较流行的软件飞信中带的VMDotNet,也就是所谓的.NET FRAMEWORK虚拟机吧。相信有很多人也已经看过相关文章了,但是对于新手我还是再提一下,在你的飞信的安装目录下有一个VMDotNet文件夹,这个就是我们要用的最主要的内容了,先把它COPY出来吧! 下面先来简单说明一下VMDotNet文件夹吧,在这个文件夹之下有一个v2.0.50727文件夹,很明显是.NET FRAMEWORK的版本号啦,进入这个文件夹,里面有一个FetionVM.exe的可执行文件(飞信的图标),这个便是我们要用到的虚拟机文件了。其 它文件我们不用考虑。这个程序可以带入一个参数,即要在此虚拟环境下运行程序的路径。形如FetionVM.exe C:\1.exe,也可以使用相对路径:FetionVM.exe 1.exe,当然这样要求两者在同一目录下啦。这里顺便要再说一下VMDotNet.log这个文件,这里记录了在调用FetionVM.exe时的错误 信息,主要是路径不对,找不到对应的程序。在了解了这个文件夹之后,我们可以动手开始做啦! 最后,为了在没安装.Net Framework的环境启动,要用其它语言写一个启动程序,来带动你的主程序.这个程序我找做C++的朋友帮写了一个,然后,只要把你们做的.NET程序中bin/debug/下可执行文件放到app文件夹下,并且命名为:9527.exe(9527是周星星的警号,好记),即可通过双击这个C++程序(无FrameWork运行示例主程序.exe)带动.NET程序了.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值