关于引用的生成的问题

转载:http://hi.baidu.com/remind_them/blog/item/1916966688991523aa184ce6.html

 

今天杂七杂八的整了很多,也发现了我以前没有注意到的一些问题。为了解决和他人共用dll的版本不一致的问题(你覆盖我,我覆盖你总是造成另一方出错),统一dll版本显得有点麻烦,而且牵扯人数众多。于是我偷懒,想找个偷懒的办法。

1. 最初想的是把我需要的dll放到某一个特定目录下, 采用assembly的方式动态调用dll,结果不停的出错。原来: 我欲调用a.dll,而a.dll调用了一堆dll(用b.dll代表),我把a.dll+b.dll都放入目录d中,动态调用a.dll,却总是出现找不到b.dll的情况。原来,即使在a调用b,也不是到与a同目录下找b,而是调用a的exe同目录下找b。唉。。。我白痴了!

2. 项目a调用项目b,项目b调用项目c,c中有引用了一个d.dll,即a->b->c->d。生成c的时候, c的bin目录下会有d.dll,毋庸置疑。生成b的时候,b的bin目录下也应该有d.dll,也没有问题。生成a的时候,a的bin目录下还是应该有d.dll,but问题是: 没有,不要质疑我的操作,真的没有,请问为什么,有人能告诉我么?

3. 同2的项目b,在debug方式下,bin目录下有d.dll,但是在release的方式下,却没有生成d.dll,why again,who can tell me?

4. 办法1失效,于是乎在同事的帮助下,确定采用把a.dll和b.dll打成一个c.dll,这样就不会造成和其他重复,而且看起来会清爽很多。找到了一个叫ILmerge的工具。用法转一个帖子,懒得写了。

[转]C#中将dll汇入exe,并加壳
2008-10-15 13:18

这几天在做自己的一个小程序,因为使用了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

不过我下的这个版本的命令格式是:

ILmerge /out:C:\destination.dll C:\file1.dll C:\file2.dll...

此外, 他居然不支持ILmerge /out:C:\destination.dll directory1 or ILmerge /out:C:\destination.dll dire\*.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以内,运行时几乎没有性能损失。最重要的,很难反编译,可以放心拿给别人用了。


 

你可能感兴趣的:(生成)