Вопрос по .net – Проблемы со ссылками на TPL Dataflow и TPL в VS 2012 RC

15

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

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

A reference to 'System.Threading.Tasks.Dataflow' could not be added.

и тогда вся Visual Studio зависает.

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

The type 'System.Threading.Tasks.Task' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Threading.Tasks, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.

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

A reference to 'System.Threading.Tasks' could not be added.

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

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

@svick: к вашим сообщениям об ошибках не могут получить доступ другие люди. Oleg
I have posted this bug to Connect. svick
Это новый проект или уже существующий? James Manning
Проблема возникает при создании нового проекта. Открытие проекта, созданного с помощью VS11 Beta, в котором уже используется TPL Dataflow, работает нормально. svick
@ Олег Ты прав, извини, я этого не заметил. Должно быть исправлено сейчас. svick

Ваш Ответ

2   ответа
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 каталог.

UPDATED: Я изучил проблему больше после прочтенияответ об удалении ссылки наSystem.Runtime и я могу добавить следующее: ссылка наSystem.Runtime будет добавлено из-за ошибки в правильной версии пакета NuGetMicrosoft.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 вы увидите

enter image description here

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

enter image description here

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

enter image description here

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

So the bug exist not in Visual Studio 2012 RC and even not in Microsoft.Tpl.Dataflow.dll. The bug is just in the metadata of the pre-release version of Microsoft.Tpl.Dataflow NuGet package available currently on "NuGet official package source".

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

UPDATED 2: Даже если мой ответ уже помечен как решенный и награда за решение проблемы все равно не уйдет из моей головы. На самом деле я вижу две открытые проблемы:

Why the existence of unused assembly System.Runtime can produce the error during the builging of the project. I see some general problems in the way how Uninstall or Update of NuGet packages works (see details later).

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

Create a new empty console application in Visual Studio 2012 RC. Verify that the project has no reference to System.Runtime. Open "Package Manager Console" from "Tools" / "Library Package Manager". Execute the command "Install-Package Microsoft.Tpl.Dataflow -Pre" in the "Package Manager Console". Verify that both System.Runtime and System.Threading.Tasks.Dataflow are included in the list of References of the project. Execute the command "Uninstall-Package Microsoft.Tpl.Dataflow" in the "Package Manager Console". Verify that System.Threading.Tasks.Dataflow are removed from the list of References of the project, but System.Runtime is still in the list of references.

Я сделал еще один эксперимент, и я изменил версию модифицированной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). После этого я мог видеть & quot; новый & quot; Версия в списке обновлений моего проекта:

enter image description here

If I install the Update the reference to System.Runtime will be also not removed.

Таким образом, текущая реализация & quot; Update & quot; и & quot; Удалить & quot; NuGet имеет ошибку или общую проблему дизайна. Если мы добавим пакет в наш проект и сделаем некоторые обновления проекта, мы получим ссылки на все зависимые сборки всех старых версий.The old references, added by NuGet from old versions of the package, will be not removed during Uninstall or Update, Прежде всего, нехорошо иметь мусор в ссылках проекта, но из-за существования первой проблемы (ошибка во время компиляции, если ссылка на не ссылается)System.Runtime существует) проблема будет еще серьезнее.

Поэтому, если в NuGet ничего не изменится, произойдет обновление до следующей версииMicrosoft.Tpl.Dataflow не решит проблему для пользователей, которые установилиMicrosoft.Tpl.Dataflow в версии 4.5.1 (или, возможно, ранней версии). Всем пользователям придется удалить ссылку наSystem.Runtime вручную. Я думаю, что это реальная проблема NuGet, которую должны решить разработчики NuGet. Я выложу описание проблемы вhttp://nuget.org/ потом.

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

Спасибо, что, кажется, работает (я использовал второй). Есть идеи, почему это происходит? svick
@svick: Кстати, я нашел в концеthe blog совет, чтобы добавить ту же ссылку, что я описал в своем ответе. Таким образом, кажется, что вы не первый человек, который имеет проблемы.
@svick: я обновил свой ответ.
Спасибо за подробности. Я не думаю, что необходимо уведомлять авторов пакета NuGet, поскольку Алок Шрирам, который указан среди владельцев этого пакета, ответил на social.msdn с исправлением System.Runtime и сказал, что это будет исправлено в следующем выпуске (не уверен, имел ли он в виду следующий выпуск пакета или Visual Studio). svick
@svick: я не изучил проблему в деталях. Без ссылки новая версияSystem.Threading.Tasks.Dataflow пытался использовать неправильную версиюSystem.Threading.Tasks.dll, Я раньше не использовал TPL Dataflow. Я просто скопировал демонстрационный код изthe page и получите ошибку, которую вы описали, и ошибку в строкеworkerBlock.Completion.Wait();: Метод ожидания не существует. Было ясно, что Microsoft изменила некоторые классы, и я использовал неправильную сборку. Так что нужно было только найти правильный.
2

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

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

Более того, ссылка наSystem.Runtime был добавленby the executing of Install-Package Microsoft.Tpl.Dataflow -Pre, но файлsystem.threading.tasks.dataflow.xml не содержат никакихSystem.Runtime текст. Если бы у нас были проблемы с загрузкой сборки, мы могли бы использоватьFuslogvw.exe для отслеживания, но у нас естьcompiler error, Кстати я использовалReSharper которые помогают удалить неиспользуемые ссылки, но не удаленыSystem.Runtime как и другие ссылки.
Да, я тоже хотел бы знать. SR не содержит никакого AssemblyRef к STT, поэтому я понятия не имею, почему его удаление помогает. svick
О, я был недостаточно осторожен. Обозреватель пакетов NuGet показывает, чтоMicrosoft.Tpl.Dataflow требоватьSystem.Runtime.dll, В метаданных пакета в разделе «Ссылки сборки платформы». один видит "System.Runtime". Итак, по крайней мере, часть происхождения проблемы:Microsoft.Tpl.Dataflow.4.5.1-rc.nupkg содержит ссылку наSystem.Runtime.dll что неправильно.
Удаление ссылки наSystem.Runtime.dll из проекта лучше как добавить новую ссылкуSystem.Threading.Tasks.dll, С другой стороны, это не совсем понятноwhy конфликт существует. Я изучил МанифестSystem.Runtime.dll в отношении «IL дизассемблер»; (ildasm.exe) и не смог увидеть никаких конфликтов. Поэтому для меня оба способа выглядят так: «Сделай это, и проблема будет решена». Поэтому я могу повторить тот же вопрос, который вы задали мне в первую очередь: «Есть идеи, почему это происходит?»
Кстати, если один удалитьboth ссылки, а затем добавить вручную.\packages\Microsoft.Tpl.Dataflow.4.5.1-rc\lib\net45\System.Threading.Tasks.Dataflow.dll второй длл (System.Runtime.dll) не будут добавлены. Так что я полагаю, что причина может быть больше в пакете NuGet. Я исследовал это в отношенииNuGet Package Explorer, но нельзя непосредственно увидеть любую ссылку наSystem.Runtime.dll (по крайней мере, в графическом интерфейсе NuGet Package Explorer). Так что проблема до сих пор не до конца ясна для меня.

Похожие вопросы