.net - 使用 ILMerge 合并 .NET 3.5 和 .NET 2.0 程序集时出现问题

标签 .net .net-assembly ilmerge

当尝试在 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 是引用的程序集。

  1. AssemblyA => v3.5
  2. 程序集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/

相关文章:

c# - ILMerge 有点迷失

c# - 循环遍历 .resx 文件中的所有资源

.net - 在 VS2012 中找不到 Microsoft.Office.Interop 程序集

c# - 不显示 .net 对象的属性和方法

c# - ApplicationSettingsBase ConfigurationErrorsException 多个程序集

.net - ILMerge.Merge : ERROR! !: 程序集中发现重复类型

c# - 为什么在运行动态编译的 EXE 时会看到控制台窗口?

.net - 如何使用开放XML检索Excel的文化信息?

c# - 拖放动态创建的快捷方式

c# - ILMerge 最佳实践