使用.NET 4.5(Beta)程序集引用的Nant构建尽管指定了"net-4.0"

Dan*_*anO 7 nant ilmerge .net-4.0 .net-4.5

安装.Net 4.5 Beta后,我的Nant构建的输出失败了:

"无法从程序集'mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'加载类型'System.Runtime.CompilerServices.ExtensionAttribute'."

因为在这个问题中 回答ExtensionAttribute从System.Core.dll移动到mscorlib.dll.因此,尽管我在nant构建脚本中指定了目标框架,但是nant构建正在合并.net4.5程序集,如下所示:

<property name="nant.settings.currentframework" value="net-4.0" />
Run Code Online (Sandbox Code Playgroud)

在Visual Studio下,构建工作正常(生成一个不需要.Net 4.5的.dll).但是我需要构建与nant一起工作,因为我们有"老学者"以及构建使用nant的进程.

我需要添加到我的nant构建脚本中以使构建实际上坚持4.0?

Dmi*_*try 10

昨天我和VS 2010并排安装了VS 2012,在重新编译和部署web项目后,它失败并出现同样的异常.经过一小时的研究,我找到了解决方案.

首先,您需要编辑 nant.exe.config

打开它,找到:

<framework
   name="net-4.0" 
Run Code Online (Sandbox Code Playgroud)

这是约.在第555行(默认配置为NAnt 0.92)

你会看到一个巨大的xml,描述了net-4.0的编译.找到三个子<reference-assemblies>元素.前两个看起来像

<reference-assemblies basedir="${path::combine(installRoot, 'v4.0.30319')}">
<reference-assemblies basedir="${path::combine(installRoot, 'v4.0.30319')}/WPF">
Run Code Online (Sandbox Code Playgroud)

第三是

<reference-assemblies basedir="${environment::get-folder-path('ProgramFiles')}/Reference Assemblies/Microsoft/Framework/.NETFramework/v4.0">
Run Code Online (Sandbox Code Playgroud)

现在 - 只需编辑前两个以匹配第三个(从第三个复制并粘贴替换第一个和第二个).在此之后,NAnt将在Reference Assemblies文件夹中查找所有.dll (而不是'破坏'Windows/Microsoft .NET/...)

不要担心/WPF第二个后缀 - Reference Assemblies所有文件都位于一个文件夹中,没有/ WPF子文件夹.

第二步 - 更改构建脚本

调用csc任务时,添加两个属性,nostdlib然后noconfig:

<csc target="..." output="..." nostdlib="true" noconfig="true" ...>
Run Code Online (Sandbox Code Playgroud)

这将禁用从csc的文件夹中自动引用"坏新"mscorlib和其他库.

在内部<references>元素 - 手动添加mscorlib.dll,system.core.dll和所有使用的系统库.NAnt会在Referenced Assemblies文件夹中找到它们:

<references>
    <include name="mscorlib.dll"/>
    <include name="Microsoft.CSharp.dll"/>
    <include name="System.dll"/>
    <include name="System.Configuration.dll"/>
    <include name="System.Core.dll"/>
    ...
Run Code Online (Sandbox Code Playgroud)

之后(并重建当然)我的网站成功启动托管机器与"原始".NET Framework 4. :)

PS看起来微软重新发明了DLL HELL :)

  • 如果您的nant脚本调用MSBuild - 那么所有工作都由MSBuild完成,并且它使用正确的程序集,例如从visual studio构建时. (2认同)