当尝试在 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)
其中 AssemblyA 是当前项目输出 $(TargetFileName),AssemblyB 是引用的程序集。
- AssemblyA => v3.5
- 程序集B => v2.0
奇怪的是,当我更改命令以使用 .NET 4 时,它起作用了:
ILMerge /out:Assembly.dll AssemblyA.dll AssemblyB.dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /log:log.txt
由于我希望合并的程序集版本为 3.5 而不是 4,我该如何让前一个命令起作用或者如何解决此错误?
最佳答案
using directory 'C:\Windows\Microsoft.NET\Framework\v3.5' for mscorlib.dll
看一下,该目录不包含 mscorlib.dll。根本没有太多内容,.NET Framework 版本 3.0、3.5 和 3.5SP1 不包含新的运行时版本。 CLR、抖动和许多基本组件仍然是 v2.0。这些后续版本中的唯一区别是添加了程序集。
因此所需的选项是 /targetplatform:v2,C:\Windows\Microsoft.NET\Framework\v2.0.50727
Fwiw,当您以 .NET 4.x 为目标时,请务必非常非常小心,c:\windows\microsoft.net 目录不再是引用程序集的主目录。现在位于 c:\program files (x86)\reference assembly。如果出现错误,可能会导致诊断极其困难 runtime errors当计算机安装了 .NET 4.5+ 时。现在,您选择哪个特定子目录确实很重要。
关于.net - 使用 ILMerge 合并 .NET 3.5 和 .NET 2.0 程序集时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26318604/