当前位置:  开发笔记 > 编程语言 > 正文

ILMerge最佳实践

如何解决《ILMerge最佳实践》经验,为你挑选了4个好方法。

你使用ILMerge吗?您是否使用ILMerge合并多个程序集以简化dll的部署?ILMerging组装后,您是否在生产中发现了部署/版本控制问题?

我正在寻找一些关于使用ILMerge来减少部署摩擦的建议,如果可能的话.



1> Lamar..:

我将ILMerge用于几乎所有不同的应用程序.我已将它集成到发布版本构建过程中,因此我最终得到的是每个应用程序的一个exe,没有额外的dll.

您不能ILMerge任何具有本机代码的C++程序集.您也无法ILMerge包含XFL for WPF的任何程序集(至少我没有取得任何成功).它在运行时抱怨无法找到资源.

我确实为ILMerge编写了一个包装器可执行文件,我在其中传递了我想要合并的项目的启动exe名称,以及输出exe名称,然后它反映了依赖程序集并使用适当的命令行参数调用ILMerge.当我向项目添加新程序集时,现在要容易得多,我不必记得更新构建脚本.


以下是ILMerge + XAML的潜在解决方法:http://richarddingwall.name/2009/05/14/wpf-how-to-combine-mutliple-assemblies-into-a-single-exe/
@Lamar你能分享ILMerge的包装器.exe吗?

2> Contango..:

介绍

这篇文章展示了如何.exe + .dll files用一个替换所有combined .exe.它还可以保持调试.pdb文件的完整性.

对于Console Apps

以下是Post Build String使用.NET 4.0的Visual Studio 2010 SP1 的基础知识.我正在构建一个包含所有子.dll文件的控制台.exe.

"$(SolutionDir)ILMerge\ILMerge.exe" /out:"$(TargetDir)$(TargetName).all.exe" "$(TargetDir)$(TargetName).exe" "$(TargetDir)*.dll" /target:exe /targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /wildcards

基本提示

输出是一个文件" AssemblyName.all.exe",它将所有子dll组合成一个.exe.

注意ILMerge\目录.您需要将ILMerge实用程序复制到解决方案目录中(这样您可以分发源代码而不必担心记录ILMerge的安装),或者将此路径更改为指向ILMerge.exe所在的位置.

高级提示

如果您无法正常工作,请打开Output并选择Show output from: Build.检查Visual Studio实际生成的确切命令,并检查错误.

示例构建脚本

这个脚本.exe + .dll files用一个替换all combined .exe.它还保持调试.pdb文件完好无损.

要使用,请将其粘贴到Post Build步骤中,在Build EventsC#项目的选项卡下,并确保在第一行中调整路径以指向ILMerge.exe:

rem Create a single .exe that combines the root .exe and all subassemblies.
"$(SolutionDir)ILMerge\ILMerge.exe" /out:"$(TargetDir)$(TargetName).all.exe" "$(TargetDir)$(TargetName).exe" "$(TargetDir)*.dll" /target:exe /targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /wildcards
rem Remove all subassemblies.
del *.dll
rem Remove all .pdb files (except the new, combined pdb we just created).
ren "$(TargetDir)$(TargetName).all.pdb" "$(TargetName).all.pdb.temp"
del *.pdb
ren "$(TargetDir)$(TargetName).all.pdb.temp" "$(TargetName).all.pdb"
rem Delete the original, non-combined .exe.
del "$(TargetDir)$(TargetName).exe"
rem Rename the combined .exe and .pdb to the original project name we started with.
ren "$(TargetDir)$(TargetName).all.pdb" "$(TargetName).pdb"
ren "$(TargetDir)$(TargetName).all.exe" "$(TargetName).exe"
exit 0



3> Surgical Cod..:

我们在Microsoft应用程序块上使用ILMerge - 而不是12个单独的DLL文件,我们有一个文件可以上传到我们的客户区,而且文件系统结构很简单.

合并文件后,我不得不编辑visual studio项目列表,删除12个单独的assmeblies并添加单个文件作为参考,否则它会抱怨它无法找到特定的程序集.我不太确定这在部署后的效果如何,值得一试.



4> Mightymuke..:

我知道这是一个老问题,但我们不仅使用ILMerge来减少依赖项的数量,而且还内化了该实用程序使用的"内部"依赖项(例如,automapper,restsharp等).这意味着它们被完全抽象掉了,使用合并实用程序的项目不需要知道它们.这再次减少了项目中所需的引用,并允许它在需要时使用/更新自己版本的相同外部库.

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有