你使用ILMerge吗?您是否使用ILMerge合并多个程序集以简化dll的部署?ILMerging组装后,您是否在生产中发现了部署/版本控制问题?
我正在寻找一些关于使用ILMerge来减少部署摩擦的建议,如果可能的话.
我将ILMerge用于几乎所有不同的应用程序.我已将它集成到发布版本构建过程中,因此我最终得到的是每个应用程序的一个exe,没有额外的dll.
您不能ILMerge任何具有本机代码的C++程序集.您也无法ILMerge包含XFL for WPF的任何程序集(至少我没有取得任何成功).它在运行时抱怨无法找到资源.
我确实为ILMerge编写了一个包装器可执行文件,我在其中传递了我想要合并的项目的启动exe名称,以及输出exe名称,然后它反映了依赖程序集并使用适当的命令行参数调用ILMerge.当我向项目添加新程序集时,现在要容易得多,我不必记得更新构建脚本.
这篇文章展示了如何.exe + .dll files
用一个替换所有combined .exe
.它还可以保持调试.pdb
文件的完整性.
以下是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 Events
C#项目的选项卡下,并确保在第一行中调整路径以指向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
我们在Microsoft应用程序块上使用ILMerge - 而不是12个单独的DLL文件,我们有一个文件可以上传到我们的客户区,而且文件系统结构很简单.
合并文件后,我不得不编辑visual studio项目列表,删除12个单独的assmeblies并添加单个文件作为参考,否则它会抱怨它无法找到特定的程序集.我不太确定这在部署后的效果如何,值得一试.
我知道这是一个老问题,但我们不仅使用ILMerge来减少依赖项的数量,而且还内化了该实用程序使用的"内部"依赖项(例如,automapper,restsharp等).这意味着它们被完全抽象掉了,使用合并实用程序的项目不需要知道它们.这再次减少了项目中所需的引用,并允许它在需要时使用/更新自己版本的相同外部库.