Подтвердить что ты не робот

Как правильно использовать Microsoft.Bcl.Async?

Я использую Microsoft.Bcl.Async package в проекте, и этот проект ссылается на другой проект, который не использует функции async.

Теперь я получаю это предупреждение об ошибке при компиляции решения (или только второго проекта):

Основная ссылка "XYZ.dll" не может быть решена, поскольку она имеет косвенную зависимость от сборки системы "System.Runtime, Version = 1.5.11.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a", которая не может быть разрешена в в настоящее время целевые рамки. ".NETFramework, Version = v4.0". Чтобы устранить эту проблему, удалите ссылку "XYZ.dll" или перенастройте приложение в версию фреймворка, содержащую "System.Runtime, Version = 1.5.11.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a".

Я использую в обоих проектах этот app.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:bcl="urn:schemas-microsoft-com:bcl">
      <dependentAssembly bcl:name="System.Runtime">
        <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.5.16.0" newVersion="2.5.16.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.5.16.0" newVersion="2.5.16.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

Что я делаю неправильно?

Я не хочу ссылаться на DLL-пакеты async.

Я не могу использовать цель .Net 4.5. Это должно быть .Net 4.

Целевая структура для всех проектов:.NET Framework 4

4b9b3361

Ответ 1

Резюме

Там есть несколько обходных решений:

  • Установите пакет Microsoft.Bcl.Async в проект ссылки.

  • Установите пакет Microsoft.Bcl.Build в проект ссылки. Это содержит фактическое исправление и является исключительно зависимостью времени сборки. Когда вы это делаете, у вас должны быть соответствующие переадресации связывания в проекте App.Config(например, вы указали выше) - независимо от того, является ли это библиотекой классов, веб-проектом или исполняемым файлом.

  • Если вам не нужна зависимость от какого-либо пакета, возьмите содержимое элемента PropertyGroup в файле Microsoft.Bcl.targets(установленном с Microsoft.Bcl.Build) и вставьте его внизу ссылающийся на проект после последнего элемента импорта.

Примечание.. Какой бы вариант вы выбрали выше, когда вы отправляете библиотеку, которая принимает зависимость от Microsoft.Bcl.Async(как и в старой Microsoft.CompilerServices.AsyncTargetingPack), вы должны отправить эти (System.Runtime, System.Threading.Tasks, Microsoft.Threading.Tasks. *) с приложением/пакетом, который использует вашу библиотеку.

Длинная история:

Как отметил Питер, это известная проблема, которая возникает только для Microsoft.Bcl.Async, а не для Microsoft.CompilerServices.AsyncTargetingPack, благодаря тому, как они разработаны.

Часть дизайна Microsoft.Bcl.Async заключалась в том, чтобы выполнить резервное копирование (через пакет NuGet) некоторых новых сборок .NET 4.5 (System.Runtime, System.Threading.Tasks), чтобы они работали в версии 4.0. MSBuild не нравится это, и это заставляет полагать, что библиотека ссылок имеет зависимость от сборки из более новой версии фреймворка. Обходной путь в пакете Microsoft.Bcl.Build исправляет это.

Ответ 2

Вместо этого используйте Async Targeting Pack для Visual Studio 11.

Install-Package Microsoft.CompilerServices.AsyncTargetingPack

Если вы предпочитаете использовать предварительную предварительную заявку Microsoft.Bcl.Async, вам придется добавить ее ко всем проектам. Следующий выпуск Bcl.Async должен улучшить обмен сообщениями, чтобы получить более подробную информацию.

Если вы используете VS 2010, единственное, что я знаю об этом, дает вам async/wait - это AsyncCTP; поэтому не имеет смысла использовать Microsoft.Bcl.Async в VS 2010.

обновление:

WRT для Microsoft.Bcl.Async: проблема с предупреждением MSB ( "не может быть разрешена... косвенная зависимость..." известна и решается. В некоторых будущих обновлениях (для MSBuild и Microsoft.Bcl.Async ) это будет исправлено, и вам не придется включать Microsoft.Bcl.Async в оба проекта.