让基于.NET的程序变成绿色版独立运行

临近国庆了,要抢火车票了,但是发现"12306分流"抢票软件是基于.NET4.0开发的,要求安装.NET4.0. Windows XP集成了.NET2.0版本 Windows 7集成了.NET3.5版本 Windows 8集成了.NET4.0版本 由于目前使用的是Windows 7,没有.NET4.0环境.当然安装是没问题的. 但是作为一个系统技术爱好者,总是想研究一下与众不同的方案??? 有没有可能免安装.NET4.0环境?

百度找到一些陈旧的资料, 说明跟我有一样需求的人还是存在的.

方案一:使用MONO MONO是为了让.NET程序跨平台的产物,支持Windows系统 软件下载地址: https://www.mono-project.com/download/stable 经过一番研究,并没有成功运行我的程序. 估计是需要用它的SDK重新编译程序,才能跨平台运行吧.

方案二:使用飞信.NET虚拟机 老版本的飞信软件,基于.NET开发,使用了定制版RemoteSoft DotNET Linker工具. 下载后发现它可以运行大部分.NET2.0版本的程序. 运行方法是FetionVM.exe your.exe 但是不能运行.NET4.0的程序. 由于它的核心方案是利用RemoteSoft DotNET Linker,所以我去找原版工具研究下.

方案三:RemoteSoft DotNET Linker 目前早已经停止更新了,官网也下线了,网上能找到的最新版本是2.1.0. 这个工具包目的就是把你的.NET程序打包为绿色版,它会自动收集所需的文件,并生成一个文件夹.

所以今天的重点就是研究RemoteSoft DotNET Linker能不能实现运行基于.NET4.0的程序.

文件夹结构如下图:

经过研究,飞信里面的FetionVM.exe其实就是mini.exe. 飞信里面的rsdeploy.dll版本号是1.0.6 这里下载的rsdeploy.dll版本号是2.1.0,这个版本可能要新一些? 尝试打包一个小工具后,发现要打包的目标程序会被命名为mini.rsm文件.由mini.exe进行启动. 还会生成一个文件夹结构,与飞信非常类似.

飞信的FetionVM.exe也是加载FetionVM.rsm,这个FetionVM.rsm就是一个空的.NET引导程序. 它会运行命令行参数指定的程序.经过实验验证这种方案兼容性要差一些. 兼容性最好的办法是直接把要运行的程序改为为mini.rsm,由mini.exe直接运行.成功率高很多.

由于它们提供的.NET版本都是2.0.50727,为了研究它能不能支持.NET4.0的程序. 对工具包的文件结构进行了分析,经过分析这套工具的原理大概是类似于IO重定向, 运行.NET程序时需要访问的注册表和文件都重定向到本地目录. mdeploy.registry这个文件就是重定向的虚拟注册表. 另外还有一个叫c的文件夹,里面装的是windows\assemly.这就是重定向的虚拟系统盘路径. 基于这个原理,我猜测理论上应该是可以支持任意版本的.NET程序的! 毕竟Windows系统的核心内容不就是注册表和文件组成的吗?…………………………

为了证明这个猜测,我从装好.NET4.0的虚拟机里面提取出.NET4.0相关的所有文件,以及注册表. 把注册表中HKLM\SOFTWARE的内容导出到mdeploy.registry 把虚拟机C:\Windows\Microsoft.NET\Framework下面的v4.0.30319全部复制到本地文件夹. 把虚拟机C:\Windows\assemly下面的文件全部复制到本地文件夹. 把bypass.exe改名为mini.rsm运行mini.exe测试一下. 报错!……. 报错!……. 报错!…….

这个时候轮到procmon上场了,跟踪一下是缺少哪个文件? 唔,发现一个问题,它要加载c\windows\assembly\GAC_MSIL\System\4.0.0.0__b77a5c561934e089 而实际上在安装好.NET4的Windows7系统中并没有这个文件. 搜索了一下,发现微软真是奇葩,竟然把.NET4的GAC文件移到了C:\Windows\Microsoft.NET\assembly文件夹. 而C:\Windows\assembly下面只有.NET2.0的GAC文件!!! 把这些缺失的文件拷贝到本地目录,再次测试….. 还是报错!……. 还是报错!……. 还是报错!…….

唔,发现一个问题,mini.exe运行时加载的程序集名称是:4.0.0.0__b77a5c561934e089 但是微软的命名又改了,变成了:v4.0_4.0.0.0__b77a5c561934e089 多了一个v4.0_的前缀,真是日了MS了!!!! 原本.NET2.0版本的命名都是规范的2.0.0.0__b77a5c561934e089 为什么到了.NET4.0要把名改为了v4.0_4.0.0.0__b77a5c561934e089??? 加个v4.0的前缀是几个意思???难道4.0.0.0还不能表示版本号吗??? 这次把所有带v4.0前缀的文件夹,全都改名.再次测试….. 还是报错!……. 还是报错!……. 还是报错!…….

唔,发现一个问题,缺少msvcr100_clr400.dll 少文件都好说,添加进来就是了..再次测试…

啊! 真的运行起来了!虽然启动慢了点,但是成功了! 分流会提示我软件名不能修改,要改为bypass.exe才行. 改名后,又发现版本要更新…. 更新后,又发现文件被它替换了. 真正的bypass.exe被我改名为bypass.rsm了. 而现在的bypass.exe是我的加载器,结果被它自动更新程序替换成了真正的bypass.exe. 又得重新改名字………………

每次运行程序都要把目标程序改名为mini.rsm文件.虽然麻烦了点. 但是RemoteSoft DotNET Linker 真是个好东西! 开发出这样的软件是个有想法的人! 这套工具的兼容性还不错,我试了好几个程序,都能正常运行.

目前添加的文件和注册表内容有点多, 还有待精简,………………

还有就是要修改一下mini.exe的程序逻辑,让它可以加载任意程序文件就好了…………….

最后把工具包的最小系统(不含任何.NET文件)上传上来,做个存档以后备用: 下载地址: https://download.csdn.net/download/qq446252221/11672183