使用ilmerge gui将dll打包进exe后,为什么会抛出 "system.nullreferenceexception

1424人阅读
C#/.NET/VS/Linq(101)
using System.Collections.G
using System.T
using System.IO;
namespace Tools
/// &summary&
/// 使用ILmerge合并Exe、Dll文件的帮助类
/// &/summary&
public class ILmerge
/// &summary&
/// 得到合并Exe、Dll文件的ILmerge语句
/// &/summary&
/// &param name=&DllPath&&Dll文件目录&/param&
/// &param name=&SourceExeFile&&原exe文件全路径&/param&
/// &param name=&TargetExeFile&&要生成的exe文件全路径&/param&
/// &returns&&/returns&
public static string GetMergeExeCmd(string DllPath,string SourceExeFile,string TargetExeFile)
StringBuilder sb = new StringBuilder();
sb.Append(&ILmerge /ndebug /target:winexe /out:&);
sb.Append(TargetExeFile);
sb.Append(& /log &);
sb.Append(SourceExeFile);
string []dllFiles = Directory.GetFiles(@DllPath,&*.dll&);
foreach (string dllFile in dllFiles)
sb.Append(& & + dllFile);
return sb.ToString();
/// &summary&
/// 得到合并Dll文件的ILmerge语句
/// &/summary&
/// &param name=&DllPath&&Dll文件目录&/param&
/// &param name=&TargetDllFile&&要生成的Dll文件全路径&/param&
/// &returns&&/returns&
public static string GetMergeDllCmd(string DllPath, string TargetDllFile)
StringBuilder sb = new StringBuilder();
sb.Append(&ILmerge /ndebug /target:dll /out:&);
sb.Append(TargetDllFile);
sb.Append(& /log &);
string[] dllFiles = Directory.GetFiles(@DllPath,&*.dll&);
foreach (string dllFile in dllFiles)
sb.Append(& & + dllFile);
return sb.ToString();
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:489198次
积分:7360
积分:7360
排名:第1774名
原创:242篇
转载:19篇
译文:11篇
评论:135条
各位朋友,有什么需要交流的最好用邮件哦,那样我看到的及时很多,发站内信我不经常看。
新浪博客:
(2)(1)(1)(6)(1)(1)(1)(5)(1)(1)(3)(18)(5)(7)(11)(5)(3)(10)(2)(2)(4)(8)(14)(1)(3)(1)(13)(5)(3)(30)(11)(28)(20)(38)(1)(3)(1)(2)C#中用ILMerge将所有引用的DLL和exe文件打成一个exe文件_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
C#中用ILMerge将所有引用的DLL和exe文件打成一个exe文件
上传于||文档简介
&&C​#​中​用​I​L​M​e​r​g​e​将​所​有​引​用​的​D​L​L​和​e​x​e​文​件​打​成​一​个​e​x​e​文​件
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩14页未读,继续阅读
你可能喜欢黄聪:C#中用ILMerge将所有引用的DLL和exe文件打成一个exe文件,有图解 - 黄聪 - 博客园
今天做了一个软件,想发布的时候才发现调用的类没几个,就像把它们都跟EXE文件打包在一起,以后复制去别的地方用也方便,于是上网搜了一下,发现网上大部分都是用ILMerge实现的,于是也自己试了一下,不过网上都没有详细的步骤演示,我就花点时间做了个教程,方便以后再有人想打包自己的程序,有篇文章可以参考,好了废话少说,马上开始:
1.先到下载ILMerge,才600多K,一下子就下好了.
2.下载后是安装:
3.不到一分钟就可以安装完毕:
4.我是安装在I盘下ILMerge目录下,以下是安装后的文件,就一个ILMerge.exe文件而已,我们等会就是用它打包程序的.
5.为了演示,我重新建了个工程,最后生成的是 Main.exe 和 newDll文件,其中newDll是Main.exe 中要引用的Dll文件,为了演示方便,我将它们都复制到了ILMerge的目录下,现在我们就试着用ILMerge将newDll和Main.exe文件打包起来吧.
6.然后进入dos窗口,进入ILMerge目录,然后执行下面代码:
I:\ILMerge\ILMerge.exe /ndebug /target:winexe& /out:newclient.exe MainExe.exe& /log newDll.dll
7.ILMerge运行时的窗口,此时它正在努力的将Main.exe和newDll文件捆绑在一起:
8.DOS窗口关闭后,我们在去ILMerge目录下看看,此时已经生成好了我们想要的newclient.exe文件,它就是Main.exe和newDll.dll的结合体啦:
以上实验在WIN7下.net framework3.5 平台,vs2008环境中测试通过1809人阅读
项目开发中经常会碰到这种情况: 程序中有些功能使用到了第三方的dll, 但又不想把第三方的dll做为单独的文件随同程序来发布,怎么办呢?在这里我向大家推荐一款非常不错的工具: ILMerge, 这个工具可以将多个dll文件合并为一个文件, 也可以把dll文件合并进exe文件,以后发布程序就不用愁啦(不过请注意,如果你合并的是第三方的dll库,可能会涉及到版权问题,合并之前请慎重考虑哦)~
以下文字摘自ILMerge的官方文档:
ILMerge 可以将多个.NET程序集合并成一个单一的程序集。不过,一些.NET程序集可能会因为某些特殊的情况(比如包含非托管代码),而不能被合并。笔者强烈建议对ILMerge的输出文件使用Preverify(包含在.NET Framework SDK工具集中)进行验证,以确保能够在.NET运行时环境中加载。
ILMerge是一个控件台应用程序,但是它所有的功能也可以用编程的方式来访问。因为Visual Studio 2005允许将一个可执行文件做为外部引用,所以你可以自已写一个客户端,将ILMerge作为一个库来调用它。
ILMerge 可以将多个输入程序集合并为一个目标程序集,输入程序集中的第一个程序集被称作主程序集。如果主程序集是一个可执行文件,那么目标输出也会是一个可执行文件,并和主程序集有相同的入口点(entry point)。而且,如果主程序集有强名称,并且提供了一个snk文件,那么目标程序集会用同样的snk文件进行重新签名,这样同样也有强名称。
请注意,何任程序或文件等(比如配置文件),如果依赖于原来的输入程序集名称,此时必须用目标程序集的名称来替代。
主程序集中的任何Win32资源也会被拷贝到目标程序集中。
ILMerge有许多选项可以来控制它的工作方式,你可以在命令行下直接输入ILMerge查看。
我这里给出几个示例:
合并DLL:ILMerge /target: library /out: output.dll input1.dll input2.dll input3.dll
合并EXE:ILMerge /target: exe /out: output.exe input1.exe input2.dll input3.dll
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:149190次
积分:1755
积分:1755
排名:第15130名
原创:10篇
转载:90篇
评论:24条
(2)(2)(1)(4)(8)(1)(1)(2)(2)(2)(12)(14)(9)(4)(20)(17)  以下实验在WIN7下.net framework3.5 平台,vs2008环境中测试通过
  今天做了一个,想发布的时候才发现调用的类没几个,就像把它们都跟EXE文件打包在一起,以后复制去别的地方用也方便,于是上网搜了一下,发现网上大部分都是用ILMerge实现的,于是也自己试了一下,不过网上都没有详细的步骤演示,我就花点时间做了个教程,方便以后再有人想打包自己的程序, 有篇文章可以参考,好了废话少说,马上开始:
  1.先到/downloads/details.aspx?FamilyID=AD-4EAE-87CF-B14AE6A939B0&displaylang=en下载ILMerge,才600多K,一下子就下好了.
  2.下载后是安装:
  3.不到一分钟就可以安装完毕:
  4.我是安装在I盘下ILMerge目录下,以下是安装后的文件,就一个ILMerge.exe文件而已,我们等会就是用它打包程序的.
  5.为了演示,我重新建了个工程,最后生成的是 Main.exe 和 newDll文件,其中newDll是Main.exe 中要引用的Dll文件,为了演示方便,我将它们都复制到了ILMerge的目录下,现在我们就试着用ILMerge将newDll和Main.exe文件打包起来吧.
  6.然后进入dos窗口,进入ILMerge目录,然后执行下面代码:
  I:ILMergeILMerge.exe /ndebug /target:winexe  /out:newclient.exe MainExe.exe  /log newDll.dll
  7.ILMerge运行时的窗口,此时它正在努力的将Main.exe和newDll文件捆绑在一起:
  8.DOS窗口关闭后,我们在去ILMerge目录下看看,此时已经生成好了我们想要的newclient.exe文件,它就是Main.exe和newDll.dll的结合体啦:
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在其源码包里,有兴趣的朋友可以研究一下。这是其官方网站:
  继续邪恶的话题,如果你的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也是免费软件,官网是:/resourcehacker/
  我这个小项目为了美化界面,用了一些邪恶的东西,最终的exe文件5MB左右,用Sixxpack处理之后,体积降到了2MB以内,运行时几乎没有性能损失。最重要的,很难反编译,可以放心拿给别人用了。
文章转载自:/1.html
阅读(...) 评论()}

我要回帖

更多关于 quot什么意思 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信