尝试在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是引用的程序集。
奇怪的是,当我更改命令以使用.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,我如何让前一个命令工作或如何解决此错误?
答案 0 :(得分:8)
使用目录'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程序集中。当机器安装了.NET 4.5+时,出错可能导致诊断runtime errors非常困难。现在确实重要的是你选择哪个特定的子目录。