首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用.NET 4.5 (测试版)程序集引用的Nant构建,尽管指定了"net-4.0“

使用.NET 4.5 (测试版)程序集引用的Nant构建,尽管指定了"net-4.0“
EN

Stack Overflow用户
提问于 2012-08-17 00:12:43
回答 3查看 4.3K关注 0票数 7

在安装Nant 4.5Beta之后,我的.Net构建的输出失败,并显示以下信息:

"could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'."

因为正如在这篇question ExtensionAttribute was moved to mscorlib.dll from System.Core.dll中回答的那样。因此,尽管我在nant构建脚本中指定了目标框架,但nant构建还是合并了.net4.5程序集:

代码语言:javascript
复制
<property name="nant.settings.currentframework" value="net-4.0" />

在Visual Studio下,构建工作正常(生成一个不需要.Net 4.5的.dll )。但我需要使用nant的构建,因为我们有“老古董”,以及使用nant的构建过程。

我需要向我的nant构建脚本添加什么才能使构建真正坚持到4.0?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-30 23:42:03

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

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

打开它并找到:

代码语言:javascript
复制
<framework
   name="net-4.0" 

这大约是。第555行(在NAnt 0.92的默认配置中)

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

代码语言:javascript
复制
<reference-assemblies basedir="${path::combine(installRoot, 'v4.0.30319')}">
<reference-assemblies basedir="${path::combine(installRoot, 'v4.0.30319')}/WPF">

第三个是

代码语言:javascript
复制
<reference-assemblies basedir="${environment::get-folder-path('ProgramFiles')}/Reference Assemblies/Microsoft/Framework/.NETFramework/v4.0">

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

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

第二步-更改构建脚本

在调用csc任务时,添加两个属性:nostdlibnoconfig

代码语言:javascript
复制
<csc target="..." output="..." nostdlib="true" noconfig="true" ...>

这将禁用从csc的文件夹中自动引用“坏的新”mscorlib和其他librares。

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

代码语言:javascript
复制
<references>
    <include name="mscorlib.dll"/>
    <include name="Microsoft.CSharp.dll"/>
    <include name="System.dll"/>
    <include name="System.Configuration.dll"/>
    <include name="System.Core.dll"/>
    ...

在那之后(当然还有重建),我的网站成功地在“原始”.NET框架4的主机上启动。:)

附言:看起来微软重新发明了DLL地狱:)

票数 10
EN

Stack Overflow用户

发布于 2012-08-17 03:21:43

你可能需要做两件事(我根本没有尝试过,但我记得4发布的时候很有帮助)。首先,在配置文件的启动部分修改nant.exe.config并将版本添加到受支持的框架版本中(我认为这就是它们所在的位置,一旦打开它,就会很明显)。然后,升级到最新最好的NaNT版本。然后,在您的构建文件中执行类似以下操作:

代码语言:javascript
复制
<property 
    name="assembly-location" value="${framework::get-assembly-directory('net-4.5')}" />
<property 
    name="dotNetReferenceAssemblyPath" value="${assembly-location}\" />

再说一次,这已经有一段时间了,我不能百分之百地确定这是否会成功,但它可能会让你走上正确的道路。

票数 1
EN

Stack Overflow用户

发布于 2014-03-26 22:32:31

基本上,Dmitry的解决方案是正确的,但在我可以在我的Windows Server2012上编译.Net 4.0程序集之前,我必须对其进行一些修改。我在我的环境中使用了最新的nant-0.93-nightly-2013-10-20。

  1. 在Visual Studio2013构建输出中可以看到,对于.Net 4.0目标,CSC是使用/noconfig和/nostdlib+标志执行的。这证明您的解决方案是valid.
  2. basedir="${environment::get-folder-path('ProgramFiles')}...“这对我不起作用,因为NAnt.exe是一个64位进程。实际上,大多数标准程序集仅在Program Files (x86)根目录下可用。我试着标记NAnt.exe,但这导致了其他问题。为了确保32位和64位进程都可以定位核心程序集,我创建了一个目录C:\Nant\Microsoft.Net\v4.0并将它们复制到那里。因为目录不在Program Files下,所以它总是可见的。
  3. 我们的NAnt构建脚本很大,我不想手动修改每个csc任务的引用。为了减少对脚本的必要修改,我每晚略微定制了NAnt 0.93。如果目标框架名称是"net-4.0“,并且任务的类型是CscTask,它会自动添加mscorlib.dll、System.dll和位于csc任务源根目录的csproj中的所有系统引用。可以在以下位置找到定制的源代码和二进制文件:http://support.decos.nl/berend/NAnt-0.93-nightly-2013-10-20-modified.zip

修改后的代码记录了添加到NAnt构建输出的引用:

代码语言:javascript
复制
Inserted reference System.Data.dll
Inserted reference System.Xml.dll
Inserted reference System.configuration.dll
Inserted reference System.dll
Inserted reference mscorlib.dll
      [csc] Compiling 11 files to '...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11991383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档