昨天我将 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">
现在,只需编辑前两个以匹配第三个(从第三个复制并粘贴替换第1个和第2个)。此后,NAnt将在参考程序集
文件夹中查找所有.dll文件(而不是'损坏的'Windows/Microsoft .NET/...)。
不必担心第二个文件名后缀中的/WPF
- 在参考程序集
中,所有文件都位于一个文件夹中,没有/WPF子文件夹。
第二步 - 更改您的构建脚本
在调用csc
任务时,添加两个属性:nostdlib
和noconfig
:
<csc target="..." output="..." nostdlib="true" noconfig="true" ...>
这将禁用从csc文件夹自动引用"bad new" mscorlib和其他库。并且在元素内手动添加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启动了:)
P.S. 看起来微软重新发明了DLL HELL :)