ILMerge 程序集未正确合并

Mig*_*uke 5 c# ilmerge build-process build .net-assembly

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

B -> A
C -> A
D -> A
D -> C
Run Code Online (Sandbox Code Playgroud)

当我在 A、B 和 C 上运行 ILMerge 时,一切都运行得很好。但是当我添加 DI 时收到以下错误:

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)
Run Code Online (Sandbox Code Playgroud)

我已尝试使用 /close 选项,如此处所示ILMerge DLL: Assembly not merged in正确,仍列为外部引用,但不幸的是它没有帮助:

In order to close the target assembly, the number of assemblies to be added to the input is 0.
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

我使用的完整命令行是:

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
Run Code Online (Sandbox Code Playgroud)

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

Mig*_*uke 4

正如@HansPassant 在上面的评论中所建议的,我联系了微软名人的迈克·巴尼特(Mike Barnett)。他能够通过以下方式帮助我解决这个问题:

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

  • 从命令中删除 /union 开关(之前添加此开关是为了解决在已由代码合同重写器重写的合并程序集上运行宪兵的问题。值得庆幸的是,由于构建过程中的更改,不再需要此开关)。