这就是我的.csproj AfterBuild的样子:
<Target Name="AfterBuild" Condition=" '$(Configuration)' == 'Release'">
<Exec Command=""..\Tools\ILMerge\ILMerge.exe" /internalize /ndebug /out:@(MainAssembly) /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 "@(IntermediateAssembly)" @(ReferenceCopyLocalPaths->'"%(FullPath)"', ' ')" 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程序集?
答案 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异常)相关的错误。
如果我将合并版本替换为非合并版本的依赖项程序集,则不会抛出异常。