昨天我将 VS 2012 与 VS 2010 并排安装,在重新编译和部署 Web 项目后,它失败并出现同样的异常。经过一个小时的研究,我找到了解决方案。
首先,您需要编辑nant.exe.config
打开它并找到:
<framework
name="net-4.0"
这是大约。在第 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">
第三是
<reference-assemblies basedir="${environment::get-folder-path('ProgramFiles')}/Reference Assemblies/Microsoft/Framework/.NETFramework/v4.0">
现在 - 只需编辑前两个以匹配第三个(从第三个复制并粘贴替换第一个和第二个)。在此之后,NAnt 将在Reference Assemblies
文件夹中查找所有 .dll(而不是“损坏的”Windows/Microsoft .NET/...)
不要担心/WPF
第二个后缀 -Reference Assemblies
所有文件都位于一个文件夹中,没有 /WPF 子文件夹。
第二步 - 更改您的构建脚本
调用csc
任务时,添加两个属性,nostdlib
和noconfig
:
<csc target="..." output="..." nostdlib="true" noconfig="true" ...>
这将禁用 csc 文件夹中“bad new”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"/>
...
在那之后(当然是重建)我的网站成功地在使用“原始”.NET Framework 4 的主机上启动。:)
PS看起来微软重新发明了DLL HELL :)