Dot-Net

VS 2012 RC 中引用 TPL 數據流和 TPL 的問題

  • June 12, 2012

我剛剛將 Visual Studio 11 Beta 升級到新的 Visual Studio 2012 RC,並且在引用 TPL 數據流時遇到了問題。

首先,我嘗試像以前一樣通過從框架中添加引用來引用 Dataflow。但是當我嘗試這樣做時,我得到一個錯誤框:

無法添加對“System.Threading.Tasks.Dataflow”的引用。

然後整個 Visual Studio 凍結。

在閱讀了 MEF 和 TPL Dataflow NuGet Packages for .NET Framework 4.5 RC之後,我認為參考列表中顯示的 Dataflow 版本是以前安裝的某種工件。所以,我嘗試使用來自 NuGet 的 Dataflow,這似乎可以工作,直到我真正嘗試編譯我的程式碼,因為我收到了一個錯誤:

“System.Threading.Tasks.Task”類型是在未引用的程序集中定義的。您必須添加對程序集“System.Threading.Tasks, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”的引用。

這很令人困惑,因為Task在 mscorlib 中,不需要其他引用。但是在引用列表中有一個引用程序集System.Threading.Tasks,所以我嘗試添加它。不幸的是,出現了一個熟悉的錯誤:

無法添加對“System.Threading.Tasks”的引用。

然後 Visual Studio 再次凍結。

難道我做錯了什麼?如何在 VS 2012 RC 中使用 TPL 數據流?

嘗試System.Threading.Tasks.dllC:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5. 或者,您可以使用C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Facades目錄。

更新:在閱讀了有關刪除對的引用的答案System.Runtime後,我進一步檢查了該問題,我可以添加以下內容:System.Runtime由於 NuGet 包的目前版本中的錯誤,將添加對的引用Microsoft.Tpl.Dataflow.4.5.1-rc。如果System.Threading.Tasks.Dataflow.dll直接在 Visual Studio 中添加對相同的System.Runtime引用,則不會添加引用並且不存在問題。

使用NuGet 包資源管理器Microsoft.Tpl.Dataflow.4.5.1-rc.nupkg可以從“NuGet 官方包源”下載原版。在 Package Matadata 的末尾,您將看到

在此處輸入圖像描述

可以修改元數據(按Ctrl-K)並刪除引用:

在此處輸入圖像描述

之後,可以將修改後的文件保存Microsoft.Tpl.Dataflow.4.5.1-rc.nupkg在某個目錄中。在 NuGet 源列表(請參閱此處此處)中添加新位置(本地目錄)後,將能夠從本地源添加新包(不要忘記選擇顯示所有包,包括預發布版本,請參閱下圖):

在此處輸入圖像描述

修改Microsoft.Tpl.Dataflow.4.5.1-rc.nupkg不添加System.Runtime,項目編譯無誤。

所以這個 bug 不存在於 Visual Studio 2012 RC 中,甚至不存在於Microsoft.Tpl.Dataflow.dll. Microsoft.Tpl.Dataflow該錯誤僅在“NuGet 官方包源”上目前可用的 NuGet 包預發布版本的元數據中。

您可以將錯誤報告發布給autors,以便修復包。

更新 2:即使我的答案已經被標記為已解決,並且授予問題的賞金仍然沒有從我的腦海中消失。實際上,我看到了兩個未解決的問題:

  1. 為什麼在項目建構過程中存在未使用的程序集會System.Runtime產生錯誤。
  2. 我在 NuGet 包的解除安裝或更新工作方式中看到了一些一般性問題(請參閱稍後的詳細資訊)。

讓我們接受這樣一個事實,即第一個問題獨立於原因而存在。第二個問題讓我坐立不安。我在這裡看到了真正的問題。大家可以做以下實驗來更好地理解我:

  1. 在 Visual Studio 2012 RC 中創建一個新的空控制台應用程序。
  2. 驗證項目沒有引用System.Runtime.
  3. 從“工具”/“庫包管理器”打開“包管理器控制台”。
  4. 在“包管理器控制台”中執行命令“ Install-Package Microsoft.Tpl.Dataflow -Pre ”。
  5. 驗證兩者System.RuntimeSystem.Threading.Tasks.Dataflow都包含在項目的參考列表中。
  6. 在“包管理器控制台”中執行命令“ Uninstall-Package Microsoft.Tpl.Dataflow ”。
  7. 驗證System.Threading.Tasks.Dataflow已從項目的引用列表中刪除,System.Runtime仍在引用列表中

我又做了一個實驗,我更改了 modified 的版本Microsoft.Tpl.Dataflow.4.5.1-rc.nupkg,其中我刪除了對System.Runtime、 from 4.5.1-rcto的引用4.5.1-rc1並將其保存在本地(它將保存在 下Microsoft.Tpl.Dataflow.4.5.1-rc1.nupkg)。之後,我可以在我的項目更新列表中看到“新”版本:

在此處輸入圖像描述

如果我安裝更新,對的引用System.Runtime也不會被刪除。

因此,NuGet 的“更新”和“解除安裝”的目前實現存在錯誤或一般設計問題。如果我們向我們的項目添加一個包並對項目進行一些更新,我們將獲得所有舊版本的所有依賴程序集的引用。NuGet 從舊版本的包中添加的舊引用在 Uninstall 或 Update 期間不會被刪除。首先,項目引用有垃圾本身不好,但是由於存在第一個問題(如果System.Runtime存在未引用的引用,則編譯時出錯)問題會更加嚴重。

因此,如果 NuGet 中沒有任何更改,則更新到下一個版本Microsoft.Tpl.Dataflow將無法解決安裝Microsoft.Tpl.Dataflow在 4.5.1 版(或可能是早期版本)中的使用者的問題。所有使用者都必須System.Runtime手動刪除對的引用。我認為這是真正的 NuGet 問題,必須由 NuGet 開發人員解決。稍後我會將問題的描述發佈到<http://nuget.org/>。

我發佈到 NuGet 的錯誤報告可以在這裡找到(抱歉,文本格式不完美)。

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