Проблемы со ссылками на TPL Dataflow и TPL в VS 2012 RC

Я только что обновил бета-версию Visual Studio 11 до новой версии Visual Studio 2012 RC, и у меня возникли проблемы со ссылкой на поток данных TPL.

Во-первых, я попытался сослаться на Dataflow, как и раньше, добавив ссылку из фреймворка. Но когда я пытаюсь это сделать, я получаю окно с ошибкой:

Не удалось добавить ссылку на «System.Threading.Tasks.Dataflow».

а потом вся Visual Studio зависает.

После прочтения Пакеты NuGet потока данных MEF и TPL для .NET Framework 4.5 RC, я предположил, что версия потока данных, показанная в списке ссылок, была своего рода артефактом предыдущей установки. Итак, я попытался использовать Dataflow из NuGet, который, казалось, работал, пока я не попытался скомпилировать свой код, потому что получил ошибку:

Тип «System.Threading.Tasks.Task» определен в сборке, на которую нет ссылок. Вы должны добавить ссылку на сборку «System.Threading.Tasks, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a».

Это сбивает с толку, поскольку Task находится в mscorlib, никаких других ссылок не требуется. Но в списке ссылок есть эталонная сборка под названием System.Threading.Tasks, поэтому я попытался добавить ее. К сожалению, знакомая ошибка показала:

Не удалось добавить ссылку на «System.Threading.Tasks».

а затем Visual Studio снова зависла.

Я делаю что-то неправильно? Как я могу использовать поток данных TPL с VS 2012 RC?


person svick    schedule 03.06.2012    source источник
comment
Это новый проект или уже существующий?   -  person James Manning    schedule 03.06.2012
comment
Проблема возникает при создании нового проекта. Открытие проекта, созданного с помощью VS11 Beta, который уже использовал поток данных TPL, работает нормально.   -  person svick    schedule 03.06.2012
comment
Я опубликовал это ошибка подключения.   -  person svick    schedule 05.06.2012
comment
@svick: Другие люди не могут получить доступ к вашему отчету об ошибке.   -  person Oleg    schedule 05.06.2012
comment
@Олег Ты прав, извини, не заметил. Должно быть исправлено сейчас.   -  person svick    schedule 05.06.2012
comment
Интересно: восстановление установки удалило STTD и STT из списка ссылок, но поток данных NuGet TPL по-прежнему требует этого.   -  person svick    schedule 05.06.2012


Ответы (2)


Попробуйте «Добавить ссылку» 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". . В конце пакета Matadata вы увидите

введите здесь описание изображения

Можно изменить метаданные (нажмите Ctrl-K) и удалить ссылку:

введите здесь описание изображения

После этого можно сохранить измененный файл Microsoft.Tpl.Dataflow.4.5.1-rc.nupkg в какую-нибудь директорию. После добавления нового местоположения (локального каталога) в список источников NuGet (см. здесь или здесь) можно будет добавить новый пакет из локального источника (не забудьте выбрать отображение всех пакетов, включая пре-релиз, см. рисунок ниже):

введите здесь описание изображения

Модифицированный Microsoft.Tpl.Dataflow.4.5.1-rc.nupkg не добавит System.Runtime и проект скомпилируется без ошибок.

Таким образом, ошибка существует не в Visual Studio 2012 RC и даже не в Microsoft.Tpl.Dataflow.dll. Ошибка содержится только в метаданных предварительной версии пакета Microsoft.Tpl.Dataflow NuGet, доступного в настоящее время в «официальном источнике пакета NuGet».

Вы можете опубликовать отчет об ошибке авторам, чтобы пакет был исправлен.

ОБНОВЛЕНО 2: даже если мой ответ уже помечен как решенный и награда за вознаграждение, проблема все еще не выходит из моей головы. На самом деле я вижу две открытые проблемы:

  1. Почему наличие неиспользуемой сборки System.Runtime может привести к ошибке при сборке проекта.
  2. Я вижу некоторые общие проблемы в том, как работает удаление или обновление пакетов NuGet (подробности см. ниже).

Примем только тот факт, что первая проблема существует независимо от причины. Вторая проблема вызывает у меня беспокойство. Я вижу здесь настоящую проблему. Каждый может провести следующий эксперимент, чтобы лучше меня понять:

  1. Создайте новое пустое консольное приложение в Visual Studio 2012 RC.
  2. Убедитесь, что в проекте нет ссылки на System.Runtime.
  3. Откройте «Консоль диспетчера пакетов» из «Инструменты» / «Диспетчер пакетов библиотек».
  4. Выполните команду "Install-Package Microsoft.Tpl.Dataflow -Pre" в "Консоли диспетчера пакетов".
  5. Убедитесь, что System.Runtime и System.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 не решит проблему для пользователей, установивших Microsoft.Tpl.Dataflow в версии 4.5.1 (или, возможно, в ранней версии). Всем пользователям придется вручную удалить ссылку на System.Runtime. Я думаю, что это настоящая проблема NuGet, которую должны решить разработчики NuGet. Я отправлю описание проблемы на http://nuget.org/ позже.

Отчет об ошибке, который я разместил в NuGet, можно найти здесь (извините за не идеальное форматирование текст).

person Oleg    schedule 05.06.2012
comment
Спасибо, вроде работает (использовал второй). Любая идея, почему это происходит? - person svick; 05.06.2012
comment
@svick: я не рассматривал проблему подробно. Без ссылки новая версия System.Threading.Tasks.Dataflow пыталась использовать неправильную версию System.Threading.Tasks.dll. Раньше я не использовал TPL Dataflow. Я просто скопировал демонстрационный код со страницы и получите описанную вами ошибку и ошибку в строке workerBlock.Completion.Wait();: метод ожидания не существует. Было видно, что Microsoft изменила некоторые классы, и я использовал неправильную сборку. Так что оставалось только найти правильный. - person Oleg; 05.06.2012
comment
@svick: Кстати, я нашел в конце блога совет добавьте ту же ссылку, что и в моем ответе. Так что похоже, что вы не первый человек, у которого есть проблема. - person Oleg; 05.06.2012
comment
Спасибо за подробности. Я не думаю, что уведомлять авторов пакета NuGet необходимо, поскольку Алок Шрирам, который указан среди владельцев этого пакета, является тем, кто ответил на social.msdn с исправлением System.Runtime и сказал, что оно будет исправлено в следующем выпуске (не уверен, имел ли он в виду следующий выпуск пакета или Visual Studio). - person svick; 08.06.2012
comment
@svick: Добро пожаловать! Я понял ответ Алока Шрирама больше, поскольку ошибка существует в Visual Studio 2012 RC, поскольку он подчеркнул, что проблема существует особенно в RC. Возможно, я неправильно понял ответ, но он был не так ясен. В любом случае исправить один элемент небольшого файла метаданных XML и опубликовать его в NuGet онлайн очень просто. Не понимаю, зачем ждать какого-то следующего релиза. - person Oleg; 08.06.2012
comment
@svick: я пишу еще одно ОБНОВЛЕНИЕ к своему ответу, где я описал еще одну важную проблему, которую я все еще вижу в обновлении/удалении NuGet. - person Oleg; 08.06.2012
comment
Оказывается, нам не пришлось долго ждать этого релиза. Могу подтвердить, что обновленный пакет NuGet работает корректно (он не добавляет ссылку на System.Runtime). - person svick; 09.06.2012
comment
@svick: Это очень хорошая новость. В новой версии 4.5.4-rc нет ссылок на неиспользуемую сборку System.Runtime. Я уверен, что это поможет другим пользователям пакета. О моем отчете об ошибке для разработчиков NuGet Я не нашел понимания проблемы. Много лет назад я тратил много времени на развертывание программного обеспечения. Я рассматриваю проблему, которую я разместил в NuGet, как серьезную проблему дизайна, но я не хочу тратить свое время на долгое обсуждение в комментариях к отчету об ошибке. Я сообщил. Один видит без проблем. В ПОРЯДКЕ. В любом случае ваш вопрос был интересен для меня. - person Oleg; 10.06.2012
comment
Шаг «Добавить ссылку на System.Threading.Tasks.dll» помог мне решить ту же проблему в аналогичной проблеме: компилятор .Net 4.6 Roslyn не распознавал возврат Task‹› внутри переносимой библиотеки классов (PCL), на которую ссылается мой проект. - person digiogo; 18.10.2015
comment
@digiogo: Добро пожаловать! Я рад узнать, что старый ответ все еще полезен в некоторых случаях. - person Oleg; 18.10.2015

По словам Алока Шрирама из MS, решение состоит в том, чтобы удалить ссылку на System.Runtime, и это будет исправлено в следующем выпуске.

Я могу подтвердить, что удаление ссылки действительно решает проблему.

person svick    schedule 07.06.2012
comment
Лучше удалить ссылку на System.Runtime.dll из проекта, чем добавить новую ссылку System.Threading.Tasks.dll. С другой стороны, не совсем понятно, почему существует конфликт. Я изучил манифест System.Runtime.dll относительно дизассемблера IL (ildasm.exe) и не обнаружил никаких конфликтов. Так что для меня оба пути похожи: сделайте это, и проблема будет решена. Так что я могу повторить тот же вопрос, который вы задали мне сначала: Есть идеи, почему это происходит? - person Oleg; 08.06.2012
comment
Да, я тоже хотел бы знать. SR не содержит AssemblyRef для STT, поэтому я понятия не имею, почему его удаление помогает. - person svick; 08.06.2012
comment
Более того, ссылка на System.Runtime была добавлена ​​при выполнении Install-Package Microsoft.Tpl.Dataflow -Pre, но файл system.threading.tasks.dataflow.xml не содержит текста System.Runtime. Если бы у нас возникли проблемы с загрузкой сборки, мы могли бы использовать Fuslogvw.exe для трассировки, но у нас ошибка компиляции. Кстати, я использовал ReSharper, которые помогают удалить неиспользуемые ссылки, но он не удаляет System.Runtime, как другие ссылки. - person Oleg; 08.06.2012
comment
Кстати, если удалить обе ссылки, а затем добавить вручную .\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). Так что проблема для меня до конца не ясна. - person Oleg; 08.06.2012
comment
О, я был недостаточно внимателен. Обозреватель пакетов NuGet показывает, что Microsoft.Tpl.Dataflow требуется System.Runtime.dll. В метаданных пакета в разделе Ссылки на сборку платформы см. System.Runtime. Так что, по крайней мере, часть происхождения проблемы: Microsoft.Tpl.Dataflow.4.5.1-rc.nupkg содержит ссылку на System.Runtime.dll, что неверно. - person Oleg; 08.06.2012
comment
Мы опубликовали версию 4.5.4-rc пакета NuGet, чтобы устранить эту проблему. - person Nicholas Blumhardt; 20.06.2012