ILMerge将winform程序打包成一个单文件可执行exe

去这里下载:

这里下载ILMerge,http://www.microsoft.com/en-us/download/details.aspx?id=17630

这里下载ILMerge-GUI,http://ilmergegui.codeplex.com/

这两部分都是必须的,第一个是命令行的,不好用。第二个是第一个大GUI封装,使第一个工具好用多了!

ILmerge-GUI是用来将一系列的exe,dll文件装载打包成一个exe文件。很好用!
这里写图片描述


ilmerge命令解析和实例

有时候要发布的软件会包含多个程序集,如果能把多个程序集合成一个有时会比较方便使用。

ILMerge.exe就是用于将多个程序集合并的工具。

官法下载地址: http://www.microsoft.com/en-us/download/details.aspx?id=17630

安装后可在命令提示符中使用。

命令内容:

Usage: 
ilmerge [/lib:directory]* [/log[:filename]] [/keyfile:filename [/delaysign]] [/internalize[:filename]] 
[/t[arget]:(library|exe|winexe)] [/closed] [/ndebug] [/ver:version] [/copyattrs [/allowMultiple] [/keepFirst]] [/xmldocs] [/attr:filename]
[/targetplatform:<version>[,<platformdir>] | /v1 | /v1.1 | /v2 | /v4] [/useFullPublicKeyForReferences]
[/wildcards] [/zeroPeKind] [/allowDup:type]* [/union] [/align:n]
/out:filename <primary assembly> [<other assemblies>...]

其中这两个是必须的参数:/out:filename <primary assembly>

out:filename 表示输出的程序集名,<primary assembly>表示输入的主程序集名。下面是一个实例:

ilmerge.exe /t:winexe /targetplatform:v2 /out:Jihua.cnblogs.com.new.exe jihua.cnblogs.com.exe Interop.IWshRuntimeLibrary.dll

这里写图片描述

D:\WorkSoftware\ILMerge>ilmerge.exe /t:winexe /targetplatform:v4 /out:C:\Users\W
u\Desktop\Baidu\BaiduAPITest\bin\Debug\qqq.exe C:\Users\Wu\Deskto
p\Baidu\BaiduAPITest\bin\Debug\BaiduAPITest.exe C:\Users\Wu\Deskt
op\Baidu\BaiduAPITest\bin\Debug\Newtonsoft.Json.dll

ILMerge使用,dll类库合并

最近做了一个数据成图组件,是对一个com控件的二次开发。

该com控件是个窗体控件在使用过程中自动生成了以AxInterop开头的AxInterop.****.dll和以Interop.开头的Interop.****.dll两个中间类,而这两个类放置的位置必须与最终的窗体同目录。

我开发的.net组件名称为:DCGjogis.dll,假设调用该组件生成的windows窗体程序为AAA.exe,要求AAA.exeDCGjogis.dll同目录,因此结果就是,该目录下包含4个文件,分别为:AAA.exe,DCGjogis.dll,AxInterop.****.dll,Interop.****.dll

而要求是该目录下只能包含AAA.exe,DCGjogis.dll两个文件,剩余的AxInterop.****.dllInterop.****.dll两个文件必须放置在指定的文件夹中。

为了解决这个问题,研究了好久,都没有什么好的办法,后来终于找到一个取巧的办法,就是使用ILMerge合并dll类库。

1、下载并安装ILMerge.exe

2、我的安装目录是:D:\Program Files (x86)\ILMerge,然后在cmd命令中,进入该目录

3、在该目录下运行ILMerge.exe命令,我的命令是:

ILMerge.exe /ndebug /target:library  /out:DCGjogis.dll DLL/DCGjogis.dll  /log DLL/AxInterop.****.dll DLL/Interop.****..dll

/target 是输出类型;/out是输出dll类名称;/log是要合并的dll类名称,由于我的其它类是放置在“DLL”目录下,因此带有路径。

注意:

1、原始DCGjogis.dll自身包含其它引用类,都需要放置在与原始DCGjogis.dll相同的目录下。

2、如果原始DCGjogis.dll自身包含其它引用类,而其它引用类是相对路径的话,那么其它引用类每次更新,合并DCGjogis.dll都需要重新合并制作。

通过合并,最终实现了AAA.exe,DCGjogis.dll同目录,即可运行。

在C#中,可以使用以下两种方法将DLL文件打包一个EXE程序中: 1. 使用ILMerge工具 ILMerge一个免费的工具,可以将多个.NET程序集合并一个程序集。你可以将所有的DLL文件EXE文件都放到同一个文件夹中,然后使用ILMerge工具将它们合并一个EXE文件。 使用ILMerge的命令行如下: ``` ILMerge.exe /out:MyApp.exe MyApp.exe MyDll1.dll MyDll2.dll ``` 其中,/out参数指定合并后的程序集名称,MyApp.exe是主程序集,MyDll1.dll和MyDll2.dll是要合并的程序集。 2. 使用Visual Studio的资源文件 另一种方法是将DLL文件作为资源文件嵌入到EXE程序中。在Visual Studio中,你可以将DLL文件添加到项目中,然后设置它们的Build Action为Embedded Resource。 然后,在代码中,你可以使用Assembly类来访问嵌入的资源。例如: ```csharp using System.Reflection; // 加载嵌入的DLL文件 Assembly assembly = Assembly.LoadFrom("MyApp.exe"); // 获取嵌入的资源流 Stream stream = assembly.GetManifestResourceStream("MyDll1.dll"); // 读取资源流中的数据 byte[] buffer = new byte[stream.Length]; stream.Read(buffer, 0, buffer.Length); // 将数据加载到内存中 Assembly dll = Assembly.Load(buffer); ``` 这个例子中,MyApp.exe是主程序集,MyDll1.dll是嵌入的DLL文件。使用Assembly.LoadFrom方法加载主程序集,然后使用Assembly.GetManifestResourceStream方法获取嵌入的资源流。最后,使用Assembly.Load方法将数据加载到内存中,这样就可以使用嵌入的DLL文件了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值