VS 2012 RC 中引用 TPL 數據流和 TPL 的問題
我剛剛將 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.dll從C:\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:即使我的答案已經被標記為已解決,並且授予問題的賞金仍然沒有從我的腦海中消失。實際上,我看到了兩個未解決的問題:
- 為什麼在項目建構過程中存在未使用的程序集會
System.Runtime產生錯誤。- 我在 NuGet 包的解除安裝或更新工作方式中看到了一些一般性問題(請參閱稍後的詳細資訊)。
讓我們接受這樣一個事實,即第一個問題獨立於原因而存在。第二個問題讓我坐立不安。我在這裡看到了真正的問題。大家可以做以下實驗來更好地理解我:
- 在 Visual Studio 2012 RC 中創建一個新的空控制台應用程序。
- 驗證項目沒有引用
System.Runtime.- 從“工具”/“庫包管理器”打開“包管理器控制台”。
- 在“包管理器控制台”中執行命令“ Install-Package Microsoft.Tpl.Dataflow -Pre ”。
- 驗證兩者
System.Runtime和System.Threading.Tasks.Dataflow都包含在項目的參考列表中。- 在“包管理器控制台”中執行命令“ Uninstall-Package Microsoft.Tpl.Dataflow ”。
- 驗證
System.Threading.Tasks.Dataflow已從項目的引用列表中刪除,但System.Runtime仍在引用列表中。我又做了一個實驗,我更改了 modified 的版本
Microsoft.Tpl.Dataflow.4.5.1-rc.nupkg,其中我刪除了對System.Runtime、 from4.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 的錯誤報告可以在這裡找到(抱歉,文本格式不完美)。



