我正在使用ILMerge从包含1个exe和2个资源dll的项目中创建单个程序集应用程序:
这是一个简单的测试项目,有1个表单(Form1.cs),所以没什么特别的.我的目标是使用工作资源管理器创建一个单独的程序集应用程序(我已阅读ILMerge和本地化资源程序集以及单程序集多语言Windows窗体部署(ILMerge和附属程序集/本地化) - 可能吗?有关如何执行的信息这个).
编译项目后,我使用以下命令行参数运行ILMerge:
ilmerge /log:test.txt /target:winexe /copyattrs /allowdup /out:test_merged.exe
"C:\projectdir\bin\Debug\test.exe" "C:\projectdir\bin\Debug\fr-FR\test.resources.dll"
"C:\projectdir\bin\Debug\nl-BE\test.resources.dll"
Run Code Online (Sandbox Code Playgroud)
如果我使用Reflector检查合并程序集的内容,我在资源树节点下看到以下内容:
而不是fr-FR和nl-BE资源,我有2倍的fr-FR资源.这是因为资源dll的名称相同吗?结果是我只能在运行时获取fr-FR资源.
有任何想法吗 ?
更新(日志文件内容):(注意:二进制文件以"loc_"为前缀,为了清楚起见,我在之前的帖子中将它们删除了)
ILMerge version 2.10.526.0
Copyright (C) Microsoft Corporation 2004-2006. All rights reserved.
ILMerge /log:loc_test.txt /target:winexe /copyattrs /allowdup /out:loc_test_merged.exe c:\Users\<user>\Documents\Visual Studio 2008\Projects\loc_test\loc_test\bin\Debug\loc_test.exe C:\Users\<user>\Documents\Visual Studio 2008\Projects\loc_test\loc_test\bin\Debug\fr-FR\loc_test.resources.dll C:\Users\<user>\Documents\Visual Studio 2008\Projects\loc_test\loc_test\bin\Debug\nl-BE\loc_test.resources.dll
Set platform to 'v2', using directory 'C:\Windows\Microsoft.NET\Framework\v2.0.50727\..\v2.0.50727' for mscorlib.dll
Running on Microsoft (R) .NET Framework …Run Code Online (Sandbox Code Playgroud) 我想创建一个单一的即DLL 合并与第三方DLL.这意味着最终消费者只需要处理1个dll而不是2个.
为了增加,可以说第三方dll是nLog.如何处理合并后的dll的消费者已经将NLog作为项目参考的情况?
理想情况下,我希望能够做的是将项目中的NLog名称空间更改为"XyzNLog",这意味着用户不需要进行任何别名...任何想法我怎么做?
现在我知道我可以为我的NLog项目添加别名,所以我必须将其称为XyzNLog,但我希望将其转移给合并dll的消费者,以便永远不会发生冲突.
更新 - 解决方案
http://blog.mattbrailsford.com/2010/12/10/avoiding-dependency-conflicts-using-ilmerge/
答对了!因此,通过使用ILMerge,可以将第三方库DLL与Providers自己的DLL合并,这意味着我们将只部署一个DLL.但这不是全部,我们实际上可以更进一步,并告诉ILMerge 内化所有依赖项.这样做会将所有第三方类转换为内部,这意味着它们只能在最终的DLL中使用.呜啊!问题解决=)
鉴于此问题,我的dll的消费者也可能有NLog消失...因为我引用的NLog转移到全部内部!这正是我想要的.
有没有人对此有任何反馈或想法?
合并程序集是否会更改内部关键字的范围?
我相当肯定它不会产生影响(或至少有一个影响),因为任何引用最终程序集的人都无法访问内部类.
这可能是一个没有现实世界价值的假设性问题,但我很好奇.
编辑:我的意思是ILMerge,而不是将源代码组合到一个可构建的程序集中.
我设法使用ILMerge将我项目中的所有程序集合并到一个程序集中,但问题是似乎没有办法签署合并的程序集.
是否有某种命令行选项或命令可以运行,这可以让我为ILMerge生成的合并程序集添加强名称?
我们遇到了一个我以前从未体验过的有趣问题.我们在Visual Studio 2008 SP1中有一个大规模生产的ASP.NET 3.5 SP1 Web App项目,它使用网站部署项目进行编译和部署.去年一切都运行良好,直到昨天办理登机手续后,应用程序开始严重失败BadImageFormatException.
有问题的登记不会改变任何特别特别的错误,错误来自应用程序的区域甚至没有改变.使用Reflector我们检查了有问题的方法,发现代码中有垃圾字符串(.NET Reflector幽默地解释为中文字符).我们一直在几台机器上重现这一点,因此它似乎与硬件无关.
进一步检查显示,在部署期间用作aspnet_merge.exe输入的程序集中不存在这些垃圾字符串.
aspnet_merge.exe/Web部署项目输出程序集属性:
- 将所有输出合并到单个程序集
- 将每个单独的文件夹输出合并到其自己的程序集
- 将所有页面和控制输出合并到单个装配中
- 为每个页面和控件输出创建单独的程序集
在Web部署项目属性中,如果我们将合并选项设置为第一个选项("将所有输出合并到单个程序集"),我们会遇到问题,但所有其他选项都可以正常运行!
我的问题:有谁知道为什么会这样?aspnet_merge.exe的功能是否有大小限制(生成的合并DLL大约为19.3 MB)?合并WAP的输出还有其他已知问题吗?
如果任何汇编格式/ aspnet_merge.exe专家知道任何此类限制,我会很高兴.对我来说就像一个25MB的程序集,虽然很大,但并不令人发指.
asp.net ilmerge assemblies aspnet-merge badimageformatexception
我正在使用ILMerge合并几个.NET程序集,包括一些第三方程序集.由于这样做,我遇到了几个错误,这些错误都归结为类型定义与它们所定义的程序集相关联的事实.
一个简单的例子是我的App.config中的log4net配置部分定义.它使用type ="log4net.Config.Log4NetConfigurationSectionHandler,log4net",由于log4net程序集合并到我的合并程序集后不存在,因此无效.不过没什么大不了的,我将程序集名称更改为我的合并程序集,它运行正常.
一个稍微复杂的例子是二进制序列化类型.我的系统使用二进制序列化在进程之间发送某些对象.所有可序列化对象都在一个所有其他项目都引用的公共程序集中定义.我使用的是默认的二进制序列化,但在反序列化对象时出现失败,错误表明它无法找到序列化对象的合并程序集.同样,没什么大不了的,我实现了一个自定义的SerializationBinder,它在任何加载的程序集中查找类型,而不仅仅是给定的类型.
当序列化类型引用其他可序列化类型时,前面的示例变得更加复杂.我继续遇到越来越多越来越难以处理的问题.
我试图在这里得到的一点是,.NET类型系统和ILMerge似乎并不能很好地协同工作.有没有人对他们如何解决这个问题有任何经验?是否有可能告诉.NET运行时我不关心它应该是什么类型的程序集,只需在任何地方查找它?
注意:请不要回答询问为什么我要合并程序集,这不是这个问题的重点.
我知道我可以将PDB与DLL文件合并,但我正在尝试使用XML文档文件.
应该可以,因为您没有带.NET程序集的.xml文件,但是您在IDE中有文档.
这该怎么做?
可能的重复:
将 .dll 与 .exe 合并
好的,所以...我将 ilmerge 的所有文件以及 .exe (CabalMain.exe) 和 dll (crckd.dll) 放在一个路径中。C:\Program Files (x86)\Microsoft\ILMerge
我转移>右键单击文件夹并打开命令提示符。因为我想合并两个,所以我输入:
C:\Program Files (x86)\Microsoft\ILMerge>C:\Program Files (x86)\Microsoft\ILMerg
e\ilmerge C:\Program Files (x86)\Microsoft\ILMerge\Cabalmain.exe C:\Program File
s (x86)\Microsoft\ILMerge\crckd.dll /out:C:\Program Files (x86)\Microsoft\ILMerg
e
Run Code Online (Sandbox Code Playgroud)
(我相信这是正确的合并过程)我收到了
C:\Program Files (x86)\Microsoft\ILMerge>C:\Program Files (x86)\Microsoft\ILMerg
e\ilmerge C:\Program Files (x86)\Microsoft\ILMerge\Cabalmain.exe C:\Program File
s (x86)\Microsoft\ILMerge\crckd.dll /out:C:\Program Files (x86)\Microsoft\ILMerg
e
Run Code Online (Sandbox Code Playgroud)
简单的说明将不胜感激。
尝试在VS Post Build中合并多个程序集时遇到了问题:
ILMerge version 2.13.307.0
Copyright (C) Microsoft Corporation 2004-2006. All rights reserved.
ILMerge /out:Assembly.dll AssemblyA.dll AssemblyB.dll /targetplatform:v2,C:\Windows\Microsoft.NET\Framework\v3.5 /log:log.txt
Set platform to 'v2', using directory 'C:\Windows\Microsoft.NET\Framework\v3.5' for mscorlib.dll
An exception occurred during merging:
Unable to cast object of type 'System.Compiler.Class' to type 'System.Compiler.Struct'.
at System.Compiler.SystemTypes.Initialize(Boolean doNotLockFile, Boolean getDebugInfo, PostAssemblyLoadProcessor postAssemblyLoad)
at ILMerging.ILMerge.Merge()
at ILMerging.ILMerge.Main(String[] args)
Run Code Online (Sandbox Code Playgroud)
AssemblyA是当前项目输出$(TargetFileName),AssemblyB是引用的程序集.
奇怪的是,当我更改命令以使用.NET 4时,它可以工作:
ILMerge /out:Assembly.dll AssemblyA.dll AssemblyB.dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /log:log.txt
Run Code Online (Sandbox Code Playgroud)
由于我希望合并的程序集是版本3.5而不是4,如何让前一个命令工作或如何解决此错误?
MSBuild.ILMerge.Task通过packagereference以下引用使用引用时出现错误:
error MSB4018: The "MSBuild.ILMerge.Task" task failed unexpectedly.
error MSB4018: System.IO.FileNotFoundException: Cannot find ILMerge
executable.
error MSB4018: at MSBuild.ILMerge.Task.LoadILMerge()
error MSB4018: at MSBuild.ILMerge.Task.Execute()
error MSB4018: at error MSB4018: at Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext()
Run Code Online (Sandbox Code Playgroud)
这是因为MSBuild.ILMerge.Task.dll在其程序包位置找不到ILMerge可执行文件。我想这可能是因为package.config和PackageReference之间的文件夹结构不同。
其他人遇到过这个问题吗?任何帮助都需要提前感谢
ilmerge ×10
.net ×6
c# ×2
dll ×2
.net-2.0 ×1
asp.net ×1
aspnet-merge ×1
assemblies ×1
cmd ×1
exe ×1
merge ×1
msbuild ×1
reflection ×1
signing ×1
strongname ×1
types ×1
winforms ×1
xml ×1