×

让.Net 程序脱离.net framework框架运行

Kalet Kalet 发表于2009-03-20 12:00:13 浏览219 评论0

抢沙发发表评论

Net框架目前逐步在普及了,仍然有很多人在寻找如何让.NET程序脱离.NET框架的方法。现成的工具有 Xenocode 的postbuidle或者vas,还有 Salamander .NET Linker。
  另外还有 MaxToCode 作者以前做的 framework linker. 以及一些支持注册表模拟和文件模拟的打包工具molebox,thinstall等。最后还有某网友兜售的一个实现方法.
  Xenocode的是使用了一个虚拟机环境,模拟框架需要的 注册表信息和文件信息.Xenocode号称的生成native代码功能实际上就是指的这个功能.我测试了几个程序打包,兼容性似乎不怎么好. 不知道是不是因为机器上已经安装了框架的原因。让.Net 程序脱离.net framework框架运行

  Jason做的 framework linker,以前我也使用过, 他的实际上是利用了 Remotesoft的内核文件,然后自己实现了一个loader。好像是使用的早期的内核文件,兼容性也不太好。
  Salamander .Net Linker ,Remotesoft的一个产品,没有可以下载的,但是其兼容性似乎很不错。移动的飞信软件就利用了它的核心。
  某网友的方法似乎是利用remotesoft的核心和飞信的框架,因为他并没有免费公开方法,从他给出的样例可以看到有remotesoft的核心文件以及飞信的框架程序。

  这里要介绍的方法是直接利用飞信的框架来实现脱离 .Net framework运行。
  首先下载一个飞信的程序安装。在安装目录中会有 VMDotNet 目录。这个就是.Net框架虚拟环境需要的文件。
  直接把整个目录提取出来。
  如何利用这个虚拟环境运行 自己的 .Net 程序呢?很简单,一个命令行搞定。在 VMDotNet 目录里面会找到一个 FetionVM.exe 。这个是虚拟环境的loader。
  使用方法: FetionVM.exe pathtoyoureexe。就是直接把你的 .Net 程序 作为命令行参数传递给 FetionVM.exe 就可以在这个虚拟环境中执行你的.net程序了。

  最好再自己写一个启动程序,首先检查系统是否安装了.Net框架,如果有直接运行。没有调用虚拟环境运行。
  这个启动程序飞信也有,如果不想自己写就直接拿飞信安装目录中的 Feition.exe,但是这样的话 你自己的.Net程序的名字必须叫 FeitionFX.exe 。把它和Feition.exe 放在同一目录下,直接执行 Feition.exe 即可。
  另外,如果你对.Net程序使用了加密保护,需要注意一下,目前市面上的大部分.Net加密工具加密后的程序集不能在这个虚拟环境中运行的。
  这个东西除了能实现脱离 .net框架运行外,还有另外一个副作用--让.net程序运行在指定版本的.net框架中(虽然机器上安装了.net框架,仍然可以让.net程序在这个虚拟框架下运行)。 


昨天晚上奋斗到两点,做完了一个图片处理软件,突然想到上次上网看到C#程序脱离.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时的错误信息,主要是路径不对,找不到对应的程序。在了解了这个文件夹之后,我们可以动手开始做啦!

        把这个文件夹复制到你的项目的DEBUG目录下,我的已有项目名为PicProcessor,生成的可执行文件为,当然你也可以视情况而定了,如果放别的地方就应该注意一下路径就好了。

        在这里我们需要再新建一个C#应用程序项目,我把它命名为PicStart,把FORM1.CS删除,或者直接新建一个控制台程序,在Program.cs中写入以下代码:

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace PicStart
{
    static class Program
    {
        /// <summary>让.Net 程序脱离.net framework框架运行
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            //下面是调用外部程序的代码
            System.Diagnostics.ProcessStartInfo Info = new System.Diagnostics.ProcessStartInfo();
            Info.FileName = "VMDotNet\\v2.0.50727\\FetionVM.exe";  //这里是你要调用到的外部程序
            Info.Arguments = "PicProcessor.exe"; //调用外部程序的参数,这里是图片处理项目的可执行文件,注意不是现在这个项目的可执行文件
            System.Diagnostics.Process Proc;

            try
            {
                //
                //启动外部程序
                //
                Proc = System.Diagnostics.Process.Start(Info);
            }
            catch (System.ComponentModel.Win32Exception e)
            {
                Console.WriteLine("系统找不到指定的程序文件。\r{0}", e);
                return;
            }
        }
    }
}

        在做完了这个项目以后我们生成此项目,这个时候我们就可以开始制作程序的安装文件了。

        以前我们利用VS2005做安装包的时候可以选择把.NET FRAMEWORK集成进去,但现在我们不用了,请大家把相应的选项全部去掉,还不会使用VS2005安装和部署功能的朋友请到此网址去看一下。http://www.vs2005.com/Setup/205/1/default.aspx

        我们把PicProcessor和PicStart项目都添加进新建的安装和部署项目Setup中来,把程序启动的快捷方式全部设为PicStart.exe就可以了,具体的操作方法在上面的链接里有。然后开始生成安装包,生成的安装包如果选择大小优先的话,VMDotNet会占用大概10Mb左右的空间,然后加上你程序的大小就是这个安装文件的大小了,比以前20多MB的.Net Framework小多了,而且安装速度也要快的多,这样程序在没有.Net Framework的机器上也能运行了,大家都试试吧,有什么问题可以给我留言。每天晚上一般我都会上线,会及时给大家回复的!
让.Net 程序脱离.net framework框架运行
        第一次写原创技术文章,不足之处,请大家多多包涵!谢谢!



群贤毕至

访客