Dot-Net-4.0

儘管指定了“net-4.0”,但使用 .NET 4.5 (Beta) 程序集引用建構 Nant

  • March 26, 2014

安裝 .Net 4.5 Beta 後,我的 Nant 建構的輸出失敗並顯示:

“無法從程序集‘mscorlib,版本=4.0.0.0,文化=中性,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" />

在 Visual Studio 下,建構工作正常(生成不需要 .Net 4.5 的 .dll)。但是我需要建構與 nant 一起使用,因為我們有“老派”以及使用 nant 的建構過程。

我需要在我的 nant 建構腳本中添加什麼以使建構實際上堅持 4.0?

昨天我將 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任務時,添加兩個屬性,nostdlibnoconfig

<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 :)

引用自:https://stackoverflow.com/questions/11991383