【问题标题】:ILMerge assembly not merged in correctlyILMerge 程序集未正确合并
【发布时间】:2012-07-31 02:05:43
【问题描述】:

我正在使用 ILMerge 版本 2.11.1103.0 将 4 个 DLL 合并到一个新程序集中。假设它们被称为A、B、C和D,它们的关系如下:

B -> A
C -> A
D -> A
D -> C

当我在 A、B 和 C 上运行 ILMerge 时,一切正常。但是,当我添加 D 时,我收到以下错误:

An exception occurred during merging:
ILMerge.Merge: The assembly 'A' was not merged in correctly.
It is still listed as an external reference in the target assembly.
   at ILMerging.ILMerge.Merge()
   at ILMerging.ILMerge.Main(String[] args)

我已尝试使用此处 ILMerge DLL: Assembly not merged in correctly, still listed as an external reference 中所示的 /closed 选项,但不幸的是它没有帮助:

In order to close the target assembly, the number of assemblies to be added to the input is 0.

当我更改程序集的顺序时,我收到以下异常:

An exception occurred during merging:
Index was outside the bounds of the array.
   at System.Compiler.ISymUnmanagedWriter.CloseMethod()
   at System.Compiler.Ir2md.VisitMethodBody(Method method)
   at System.Compiler.Ir2md.VisitMethod(Method method)
   at System.Compiler.Ir2md.Visit(Node node)
   at System.Compiler.Ir2md.VisitClass(Class Class)
   at System.Compiler.Ir2md.Visit(Node node)
   at System.Compiler.Ir2md.VisitModule(Module module)
   at System.Compiler.Ir2md.SetupMetadataWriter(String debugSymbolsLocation)
   at System.Compiler.Ir2md.WritePE(Module module, String debugSymbolsLocation, BinaryWriter writer)
   at System.Compiler.Writer.WritePE(String location, Boolean writeDebugSymbols, Module module, Boolean delaySign, String keyFileName, String keyName)
   at System.Compiler.Writer.WritePE(CompilerParameters compilerParameters, Module module)
   at System.Compiler.Module.WriteModule(String location, CompilerParameters options)
   at ILMerging.ILMerge.Merge()
   at ILMerging.ILMerge.Main(String[] args)

我使用的完整命令行是:

ILMerge.exe /targetplatform:v4,"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0" /log:ilmerge.log /target:library /union /xmldocs /copyattrs /allowMultiple /internalize /closed /keyfile:keyfile.snk /out:Merged.dll A B C D

谁能看到我做错了什么?谢谢。

【问题讨论】:

  • 将附加到电子邮件的程序集发送给 Microsoft Research 的 Mike Barnett。他过去一直很敏感,所以你会有一些几率会收到回复。他的电子邮件地址在此页面上:research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx
  • 太棒了,谢谢。会试一试的。
  • 就我而言,这个错误是非破坏性的。合并的 DLL 通过了所有单元测试,检查程序集表明一切都在那里。所以不确定哪些元素“没有正确合并”。

标签: c# build build-process .net-assembly ilmerge


【解决方案1】:

正如@HansPassant 在上面的评论中所建议的,我联系了微软名气的 Mike Barnett。他能够通过以下方式帮助我解决此问题:

  • 从http://nuget.org/packages/ilmerge升级到最新版本的ilmerge (2.12.0803)

  • 从命令中删除 /union 开关(之前添加此选项是为了解决在已由代码合同重写器重写的合并程序集上运行 gendarme 的问题。谢天谢地,由于构建过程发生了变化,这不是需要更长的时间)。

【讨论】:

    【解决方案2】:

    我之前遇到过 ILMerge 无法正常工作的问题。我想他们只是错误......尝试在多个阶段合并,例如将 B 和 A 合并到 A' 中,然后将 A' 与 C 和 D 合并。也许这会产生不同的结果/错误,从而可能导致解决方案。

    【讨论】:

    • 谢谢。不幸的是,我已经尝试过同样的结果。我想我会继续抨击它,看看我是否能发现一些东西。 :(
    • 哦,这对我有用。简单的 WCF 合同程序集。将 Shared 合并到 Main 不断给我外部引用异常。使用 /close 没有帮助。我拼命换了命令,它奏效了。 :)(运行当前最新版本,2.13.0307)
    猜你喜欢
    • 2010-12-20
    • 2014-09-17
    • 2017-12-03
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2011-02-03
    • 2015-04-20
    相关资源
    最近更新 更多