在VS 2012 RC中引用TPL数据流和TPL的问题

svi*_*ick 15 .net task-parallel-library nuget tpl-dataflow visual-studio-2012

我刚刚将Visual Studio 11 Beta升级到新的Visual Studio 2012 RC,并且在引用TPL Dataflow时遇到了问题.

首先,我尝试通过添加框架中的引用,像之前一样引用Dataflow.但是当我尝试这样做时,我得到一个错误框:

无法添加对"System.Threading.Tasks.Dataflow"的引用.

然后整个Visual Studio冻结.

在阅读了用于.NET Framework 4.5 RC的MEF和TPL Dataflow NuGet包之后,我假设在引用列表中显示的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 Dataflow?

Ole*_*leg 24

尝试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 Package Explorer可以Microsoft.Tpl.Dataflow.4.5.1-rc.nupkg从"NuGet官方软件包源" 下载原始文件.在包数据元结束时,您将看到

在此输入图像描述

可以修改元数据(按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仍在引用列表中.

我提出一个更实验和我改变的版本修改Microsoft.Tpl.Dataflow.4.5.1-rc.nupkg,其中I除去参照System.Runtime从,4.5.1-rc4.5.1-rc1和本地保存它(它将下保存Microsoft.Tpl.Dataflow.4.5.1-rc1.nupkg).之后我可以在项目的更新列表中看到"新"版本:

在此输入图像描述

如果我安装了更新,System.Runtime则也不会删除引用.

因此,NuGet的"更新"和"卸载"的当前实现具有错误或一般设计问题.如果我们在项目中添加了一个包并对项目进行了一些更新,我们将获得所有旧版本的所有依赖程序集的引用.NuGet从旧版本的软件包添加的旧引用在卸载或更新期间不会被删除.首先,在项目引用中存在垃圾本身并不好,但由于存在第一个问题(如果System.Runtime存在对未引用的引用,编译期间的错误)问题将更加严重.

因此,如果在NuGet中没有任何更改,则对下一版本的更新Microsoft.Tpl.Dataflow将无法解决Microsoft.Tpl.Dataflow在4.5.1版(或可能是早期版本)中安装的用户的问题.所有用户都必须System.Runtime手动删除引用.我认为这是NuGet开发人员必须解决的真正的NuGet问题.我稍后会将问题的描述发布到http://nuget.org/.

我发布到NuGet的错误报告可以在这里找到(抱歉没有完美的文本格式).