【问题标题】:Problems with references to TPL Dataflow and TPL in VS 2012 RCVS 2012 RC 中引用 TPL 数据流和 TPL 的问题
【发布时间】:2012-06-03 10:57:17
【问题描述】:

我刚刚将 Visual Studio 11 Beta 升级到新的 Visual Studio 2012 RC,但在引用 TPL 数据流时遇到了问题。

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

无法添加对“System.Threading.Tasks.Dataflow”的引用。

然后整个 Visual Studio 冻结。

阅读MEF and 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 数据流?

【问题讨论】:

  • 这是一个新项目还是现有项目?
  • 新建项目时出现问题。打开一个使用 VS11 Beta 创建的已使用 TPL Dataflow 的项目可以正常工作。
  • @svick:其他人无法访问您的错误报告。
  • @Oleg 你是对的,对不起,我没有注意到。现在应该修好了。

标签: .net task-parallel-library nuget visual-studio-2012 tpl-dataflow


【解决方案1】:

尝试从C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5 显式“添加引用”System.Threading.Tasks.dll。或者,您可以使用C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Facades 目录。

更新:在阅读the answer 后,我进一步检查了有关删除对System.Runtime 的引用的问题,我可以添加以下内容:将添加对System.Runtime 的引用,因为NuGet 包Microsoft.Tpl.Dataflow.4.5.1-rc 的当前版本出错。如果直接在 Visual Studio 中添加对同一 System.Threading.Tasks.Dataflow.dll 的引用,则不会添加 System.Runtime 引用,也不存在任何问题。

使用NuGet Package Explorer可以从“NuGet官方包源”下载原版Microsoft.Tpl.Dataflow.4.5.1-rc.nupkg。在 Package Matadata 的末尾会看到

可以修改元数据(按Ctrl-K)并删除引用:

之后可以将修改后的文件Microsoft.Tpl.Dataflow.4.5.1-rc.nupkg保存在某个目录中。在 NuGet 源列表(请参阅herehere)中添加新位置(本地目录)后,将能够从本地源添加新包(不要忘记选择显示所有包,包括 pre -release 见下图):

修改后的Microsoft.Tpl.Dataflow.4.5.1-rc.nupkg不会添加System.Runtime,项目编译不会出错。

所以这个错误在 Visual Studio 2012 RC 中不存在,甚至在 Microsoft.Tpl.Dataflow.dll 中也不存在。该错误仅在“NuGet 官方包源”上当前可用的Microsoft.Tpl.Dataflow 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的版本,把System.Runtime的引用从4.5.1-rc删除到4.5.1-rc1,并保存在本地(会保存在Microsoft.Tpl.Dataflow.4.5.1-rc1.nupkg下) )。之后,我可以在我的项目更新列表中看到“新”版本:

如果我安装更新,对 System.Runtime 的引用也不会被删除。

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

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

我发布到 NuGet 的错误报告可以在 here 找到(抱歉文本格式不完美)。

【讨论】:

  • 谢谢,这似乎有效(我使用了第二个)。知道为什么会这样吗?
  • @svick:我没有详细检查这个问题。在没有引用的情况下,System.Threading.Tasks.Dataflow 的新版本试图使用错误版本的System.Threading.Tasks.dll。我以前没有使用过 TPL 数据流。我刚刚从the page 复制了演示代码并得到了您描述的错误以及workerBlock.Completion.Wait(); 行中的错误:等待方法不存在。很明显,微软改变了一些类,我使用了错误的程序集。因此,您只需找到正确的。
  • @svick:顺便说一句,我在the blog 的末尾找到了添加与我在回答中描述的相同参考的提示。所以看来你不是第一个遇到问题的人。
  • 感谢您提供详细信息。我认为没有必要通知 NuGet 包的作者,因为在该包的所有者中列出的 Alok Shriram 是在 social.msdn 上用 System.Runtime 修复响应并说它将是在下一个版本中修复(不确定他是指包的下一个版本还是 Visual Studio 的下一个版本)。
  • @svick:不客气!我更了解the answer of Alok Shriram,因为该错误存在于 Visual Studio 2012 RC 中,因为他强调该问题尤其存在于 RC 中。可能我误解了答案,但不是很清楚。无论如何,修复小型 XML 元数据文件的一个元素并在 NuGet 上在线发布非常容易。我不明白为什么要等待“下一个版本”。
【解决方案2】:

According to Alok Shriram from MS, the solution is to remove the reference to System.Runtime,这将在下一个版本中修复。

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

【讨论】:

  • 从项目中删除对System.Runtime.dll的引用最好是添加新的引用System.Threading.Tasks.dll。另一方面,它并不清楚为什么存在冲突。我检查了System.Runtime.dll 关于“IL Disassembler”(ildasm.exe)的清单,但看不到任何冲突。所以对我来说,两种方式都像是:“这样做,问题就会得到解决”。所以我可以重复你首先问我的同一个问题:“知道为什么会发生这种情况吗?”
  • 是的,我也想知道。 SR 不包含任何对 STT 的 AssemblyRef,所以我不知道为什么删除它会有所帮助。
  • 此外,对System.Runtime 的引用是通过执行Install-Package Microsoft.Tpl.Dataflow -Pre 添加的,但文件system.threading.tasks.dataflow.xml 不包含任何System.Runtime 文本。如果我们遇到一些程序集加载问题,我们可以使用Fuslogvw.exe 进行跟踪,但是我们有编译器错误。顺便说一句,我使用了ReSharper,它有助于删除未使用的引用,但它不会像其他引用一样删除System.Runtime
  • 顺便说一句,如果一个删除 both 引用,然后手动添加.\packages\Microsoft.Tpl.Dataflow.4.5.1-rc\lib\net45\System.Threading.Tasks.Dataflow.dll,则不会添加第二个 dll (System.Runtime.dll)。所以我想原因可能更多在 NuGet 包中。我对NuGet Package Explorer 进行了检查,但无法直接看到对System.Runtime.dll 的任何引用(至少在NuGet Package Explorer 的GUI 中)。所以这个问题对我来说还不是很清楚。
  • 哦,我不够仔细。 NuGet 包资源管理器确实显示 Microsoft.Tpl.Dataflow 需要 System.Runtime.dll。在“框架程序集引用”下的包元数据中,请参阅“System.Runtime”。所以至少问题根源的一部分:Microsoft.Tpl.Dataflow.4.5.1-rc.nupkg 包含对System.Runtime.dll 的引用,这是错误的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多