我的原创__发布时给应用程序瘦身(压缩和简化)

1.尽量将用到的资源放到资源文件中

   读取资源的方法

   eg: byte[] bit = HSOSSDownDataCS.Properties.Resources.Skin;
           MemoryStream ms = new MemoryStream(bit);
            skinUI1.LoadSkinStream(ms);
            ConfigInitial("get");

2.对多个dll打包成一个,用到一个开源的工具netZ(http://madebits.com/netz/download.php)

  自行下载

使用方法和介绍:

         ETZ是一个开源的支持.NET程序压缩的工具,它也可以将一个EXE和多个DLL合并在一起执行。

如果要压缩一个EXE程序,只需要执行:
netz app.exe

如果要指定图标,可以执行:
netz app.exe -i app.ico

如果程序是控制台程序,需要执行:
netz -c app.exe

也可以把程序和DLL合并为一个应用程序:
netz -s app.exe lib1.dll lib2.dll

.NETZ的工作原理,实际上是先利用#ZipLib 对执行文件进行压缩。执行时在内存中先释放,再利用reflection来实现加载和调用。可以参考DDJ上的相关文章http://www.ddj.com/documents/s=9570/ddj0503m/0503m.html
***********************************************************************************************
.NETZ可以集成到Visual Studio(以下简称VS)之中,在通过VS的ClickOnce发布程序之前自动调用.NETZ便可实现对.Net程序集的自动压缩和简单加密。实现步骤如下:

1,将下载下来的.NETZ程序解压出来放置在一个特定文件夹下面,假设是在D:/netz文件夹下面.

2,准备批处理程序(供VS调用):

假设整个项目位于D:/project1/,项目名称为project1,VS的安装路径为默认路径,并且创建了签名文件project1.snk 和project1.pfx.
新建一个文本文件命名为MyNetz.bat,并将其保存在D:/netz/文件夹中,用记事本打开复制以下内容(需对项目路径和名称进行替换):

@echo off
echo Step1:执行压缩
D:/netz/netz.exe -s -z D:/project1/obj/Release/project1.exe -so -kf D:/project1/project1.snk
echo Step2:给压缩后的程序集重新签名
"C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/Bin/sn.exe" -Ra D:/project1/obj/Release/project1.exe.netz/project1.exe
D:/project1/project1.snk
echo Step3:复制压缩结果到bin和obj目录
copy /Y D:/project1/obj/Release/project1.exe.netz/project1.exe D:/project1/obj/Release/
copy /Y D:/project1/obj/Release/project1.exe.netz/project1.exe D:/project1/bin/Release/
echo Step4:复制更新应用程序清单所需的文件
copy /Y D:/project1/project1.ico D:/project1/obj/Release/project1.exe.netz/project1.ico
copy /Y D:/project1/app.config D:/project1/obj/Release/project1.exe.netz/project1.exe.config
echo Step5:project1.exe.manifest
"C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/Bin/mage.exe" -Update D:/project1/obj/Release/project1.exe.manifest -fd
D:/project1/obj/Release/project1.exe.netz
echo Step6:为project1.exe.manifest签名
"C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/Bin/mage.exe" -Sign D:/project1/obj/Release/project1.exe.manifest
CertFile D:/project1/project1.pfx -Password xxxxxx
echo Step7:更新project1.application
"C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/Bin/mage.exe" -Update D:/project1/obj/Release/project1.application -
AppManifest D:/project1/obj/Release/project1.exe.manifest
echo Step8:为project1.application签名
"C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/Bin/mage.exe" -Sign D:/project1/obj/Release/project1.application -
CertFile D:/project1/project1.Client.pfx -Password xxxxxx
echo Step9:project1.exe.manifest和project1.application到bin目录
copy /Y D:/project1/obj/Release/project1.exe.manifest D:/project1/bin/Release/
copy /Y D:/project1/obj/Release/project1.application D:/project1/bin/Release/

3,编辑VS的生成事件:

在project1的项目属性里面,切换到"生成事件"项:
在"生成后事件命令行"中输入以下命令(完成对批处理的调用)

If $(ConfigurationName) == Release d:/netz/MyNetz.bat
在"预生成事件命令行"中输入以下命令(目的是在发布之前删除上次压缩生成的文件,否则再次执行压缩时会对压缩后的文件又执行压缩):

If $(ConfigurationName) == Release del /Q $(ProjectDir)obj/Release/project1.exe
完成了上面的工作,当在Release配置下生成项目时就可以对exe进行自动压缩了。如果您的exe依赖于一个类库项目的话,需要对setp1中的内容作如下修改:
D:/netz/netz.exe -s -z D:/project1/obj/Release/project1.exe 类库路径/类库1.dll -so -kf D:/project1/project1.snk

go,go瘦掉50%以上,最终文件只有一个dll,和一个exe文件

3 继续:

运行目录下有很多dll文件,最终发布时,我打算将dll文件都合并到exe文件中去。微软发布的免费软件ILmerge可以完成这项工作,研究了一下,其用法如下:

1、合并file1.dll、file2.dll到destination.dll

ILmerge /ndebug /target:dll /out:C:/destination.dll /log C:/file1.dll C:/file2.dll

2、合并file1.dll、file2.dll以及myApp.exe到newApp.exe

ILmerge /ndebug /target:winexe /out:C:/newApp.exe /log C:/myapp.exe C:/file1.dll C:/file2.dll

 
注意:合并为exe时,myapp.exe必须写在file1.dll、file2.dll前面

完成之后,就得到了一个exe文件,如果想做一些邪恶的事情,可以将一些破解软件的dll合并到你的exe中去。前提是,所有的dll都是托管的,如果尝试合并C++写的dll,则会失败。有一个工具,叫做mergebin.exe,可以合并托管和非托管dll,用法我还没研究出来,似乎比较困难的样子。这个工具是ADO.NET 2.0 Data Provider for SQLite的作者写的,他发布的System.Data.SQLite.dll可以被dotNet程序引用,还可以直接被C/C++程序调用,这个dll就是托管和非托管混合的dll,果然是很牛的!mergebin.exe在其源码包里,有兴趣的朋友可以研究一下。这是其官方网站:http://sqlite.phxsoftware.com

继续邪恶的话题,如果你的exe里面合并有破解的dll,你可能不想让别人知道,或者你不想让别人反编译你的exe文件。混淆软件都收费,而且混淆之后方法还是看得见的,只不过名字毫无规则,没办法,用不了。还是加壳来的直接,我们得找一款很牛的加壳软件。给大家推荐个软件,叫做Sixxpack,专门加壳dotNet程序的,目前的最新版本为Sixxpack22,要求机器上装有.netframework2.0以上版本。Sixxpack除了加壳,还使用了压缩技术,最高压缩比达80%。Sixxpack是免费软件,官网是:http://www.reversers.net/

经Sixxpack加壳后,用Reflector打开exe文件,哈哈,看到的永远都只是一个actmp.dll的信息,其中包含4个7zip命名空间和1个Sixxpack命名空间,反编出来这些东西对也没啥用处。呵呵,原来是用7zip压缩的,难怪那么高的压缩比。

有一个问题是,用Sixxpack处理之后的程序集,版本信息是0.0.0.0,其他信息也不对。没关系,使用Resource Hacker修改一下就OK了! Resource Hacker也是免费软件,官网是:http://angusj.com/resourcehacker/

我这个小项目为了美化界面,用了一些邪恶的东西,最终的exe文件5MB左右,用Sixxpack处理之后,体积降到了2MB以内,运行时几乎没有性能损失。最重要的,很难反编译,可以放心拿给别人用了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值