使用ILMerge错误构建

时间:2010-06-24 02:27:21

标签: .net msbuild build ilmerge

有没有人与IlMerge有这个错误?我正在尝试使用4.0 Framework为.NET项目合并一些程序集。

ILMerge / log /lib:...Libraries / targetplatform:v4 /internalize:..\SolutionFiles\CJCommon.exclude / ndebug /out:bin\Release\Common.dll obj \ Release \ Common.dll C:\开发\ CJCommon \ Libraries \ FluentNHibernate.dll C:\ Development \ CJCommon \ Libraries \ HibernatingRhinos.Profiler.Appender.dll C:\ Development \ CJCommon \ Libraries \ Iesi.Collections.dll C:\ Development \ CJCommon \ Libraries \ log4net。 DLL C:\ Development \ CJCommon \ Libraries \ Microsoft.Practices.ServiceLocation.dll C:\ Development \ CJCommon \ Libraries \ NHibernate.ByteCode.Castle.dll C:\ Development \ CJCommon \ Libraries \ NHibernate.dll C:\ Development \ CJCommon \ Libraries \ NHibernate.Linq.dll C:\ Development \ CJCommon \ Libraries \ StructureMap.dll

将平台设置为'v4',使用目录'C:\ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727 .. \ v4.0.20107'for mscorlib.dll

合并期间发生异常:

对象引用未设置为对象的实例。

 at System.Compiler.CoreSystemTypes.GetSystemAssembly(Boolean doNotLockFile, Boolean getDebugInfo)
 at System.Compiler.CoreSystemTypes.Initialize(Boolean doNotLockFile, Boolean getDebugInfo)
 at System.Compiler.SystemTypes.Initialize(Boolean doNotLockFile, Boolean getDebugInfo)
 at ILMerging.ILMerge.Merge()
 at ILMerging.ILMerge.Main(String[] args)

C:\ Program Files(x86)\ MSBuild \ Ilmerge.CSharp.targets(8,5):错误MSB3073:命令“”C:\ Program Files(x86)\ Microsoft \ Ilmerge \ Ilmerge.exe“/ log /lib:"...Libraries“/ targetplatform:v4 /internalize:./.exited with code 1 ...

...

==========重建全部:3成功,1失败,0跳过==========

2 个答案:

答案 0 :(得分:11)

在targetplatform中包含4.0 Framework的路径,并确保使用引号。例如,来自PowerShell:

.\ILMerge /out:Merged.dll /targetplatform:'v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319' .\Assembly1.dll .\Assembly2.dll

答案 1 :(得分:0)

我之所以回答这个旧问题,是因为我在Stack Overflow上找不到自己的相关问题的答案,这可能会对其他人有所帮助。就我而言,我试图接触并重建VS2013中的旧解决方案以修复安装程序中的故障(无法识别IIS10比IIS4更新)。

合并操作给我一个“系统找不到指定的文件,错误代码0x80070002”,如果您忽略该错误并安装了该应用程序,它将陷入运行时异常。当然,“指定文件”就在构建文件夹中。

此问题的根本原因是4.0之后的框架已经“就地升级”,其中一些依赖项在核心库中移动(有关详细讨论,请参见:http://www.hurryupandwait.io/blog/what-you-should-know-about-running-ilmerge-on-net-4-5-assemblies-targeting-net-4-0)。总而言之,您可能会使用ilmerge的多个版本,但是只有最新版本的ilmerge保证能够准确地重新整理依赖项,以便在运行时可以找到所需的内容,而不是指定的文件丢失,它是指向底层调用的指针。

在我的情况下,解决方案是找到从NuGet中检索到的ilmerge版本,并从我的旧解决方案中引用该版本,同时保留所有其他内容。 (我应该早知道这一点,但是我很着急/没有直截了当,错误信息误导了……)。