16

我刚刚将 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 数据流?

4

2 回答 2

25

尝试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 的错误报告可以在这里找到(抱歉,文本格式不完美)。

于 2012-06-05T15:37:35.470 回答
2

根据 MS 的 Alok Shriram 的说法,解决方案是删除对 System.Runtime 的引用,这将在下一个版本中修复。

我可以确认删除引用实际上可以解决问题。

于 2012-06-07T18:59:26.113 回答