ILMerge'd程序集的运行时版本是v4.0.20926;预期版本是v4.0.30319

时间:2010-05-12 15:10:23

标签: .net ilmerge

这就是我的.csproj AfterBuild的样子:

  <Target Name="AfterBuild" Condition=" '$(Configuration)' == 'Release'">
    <Exec Command="&quot;..\Tools\ILMerge\ILMerge.exe&quot; /internalize /ndebug /out:@(MainAssembly) /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 &quot;@(IntermediateAssembly)&quot; @(ReferenceCopyLocalPaths->'&quot;%(FullPath)&quot;', ' ')" Condition=" '$(TargetFrameworkVersion)' == 'v4.0'" />
  </Target>

我正在运行64位Windows。我尝试将.NET Framework从...\Microsoft.NET\Framework\...更改为...\Microsoft.NET\Framework64\...,但它没有帮助。

我还在ILMerge目录中创建了ILMerge.exe.config:

<?xml version ="1.0"?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <requiredRuntime safemode="true" imageVersion="v4.0.30319" version="v4.0.30319"/>
    </startup>
</configuration>

为什么ILMerge不能生成4.0.30319程序集?

2 个答案:

答案 0 :(得分:5)

编辑:此问题已于2011年5月2日发布的v2.11.0502中修复,因此我删除了自定义版本的下载链接。

我修复了ILMerge.exe(v2.10.0526),以便设置目标运行时版本 v4.0.30319 而不是 v4.0.20926 。您可以从以下链接下载ILMerge.exe的固定版本:

(已删除链接,下载正式版here

像往常一样使用此参数运行

/targetplatform:v4,c:\Windows\Microsoft.NET\Framework\v4.0.30319

,输出程序集现在将定位到v4.0.30319。我已经用Reflector检查过了,没关系。让我知道你的结果。

请注意,您不需要使用该ILMerge.exe.config,我想这是用于运行带有.Net 4框架的ILMerge.exe本身,但这并不意味着它会强制生成ILMerge.exe。 Net 4组件。输出程序集的目标框架版本仅使用 / targetplatform 参数进行控制。

答案 1 :(得分:1)

同样的问题在这里!!

我正在使用ILMerge来定位带有和不带/ targetplatform:v4的v4并获得相同的结果:.net运行时版本定位具有更大的.net v4版本(如反射器所述)。

我开始挖掘的基本问题是与基于Linq和Lambda的代码中的(无法加载类型System.Func'2异常)相关的错误。

如果我将合并版本替换为非合并版本的依赖项程序集,则不会抛出异常。