web-dev-qa-db-ja.com

Microsoft.Bcl.Asyncの正しい使用方法は?

Microsoft.Bcl.Asyncパッケージ プロジェクト内にあり、このプロジェクトは非同期機能を使用しない別のプロジェクトによって参照されています。

ソリューションをコンパイルすると(または2番目のプロジェクトのみ)、このエラー警告が表示されます。

フレームワークアセンブリ "System.Runtime、Version = 1.5.11.0、Culture = neutral、PublicKeyToken = b03f5f7f11d50a3a"に間接的に依存しているため、プライマリ参照 "XYZ.dll"を解決できませんでした。フレームワーク。 「.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を参照したくありません。

.Net 4.5ターゲットを使用できません。 .Net 4である必要があります。

すべてのプロジェクトのターゲットフレームワーク:.NET Framework 4

26
punker76

概要

いくつかの回避策があります。

  1. Microsoft.Bcl.Asyncパッケージを参照プロジェクトにインストールします。

  2. Microsoft.Bcl.Buildパッケージを参照プロジェクトにインストールします。これには実際の修正が含まれており、ビルド時の依存関係にすぎません。これを行う場合、クラスライブラリ、Webプロジェクト、実行可能ファイルのいずれであるかに関係なく、プロジェクトのApp.Config(上記にリストしたものなど)に適切なバインディングリダイレクトが必要です。

  3. どのパッケージにも依存しない場合は、Microsoft.Bcl.targetsファイル(Microsoft.Bcl.Buildと共にインストールされる)内のPropertyGroup要素のコンテンツを取得し、最後のインポート後に参照プロジェクトの下部に挿入します。素子。

注:上記で選択したオプションのうち、Microsoft.Bcl.Asyncに依存するライブラリを出荷する場合(古いMicrosoft.CompilerServices.AsyncTargetingPackと同様)、それらのバイナリ(システム.Runtime、System.Threading.Tasks、Microsoft.Threading.Tasks。*)を、ライブラリを使用するアプリケーション/パッケージとともに使用します。

長い話

Peterが指摘したように、これは既知の問題であり、Microsoft.Bcl.Asyncでのみ発生し、Microsoft.CompilerServices.AsyncTargetingPackでは発生しません。これは、その設計方法が原因です。

Microsoft.Bcl.Asyncの設計の一部は、4.0で実行できるように、いくつかの新しい.NET 4.5アセンブリ(System.Runtime、System.Threading.Tasks)を(NuGetパッケージを介して)バックポートすることでした。 MSBuildはこれを好まないため、参照しているライブラリが新しいフレームワークバージョンのアセンブリに依存していると信じ込ませます。 Microsoft.Bcl.Buildパッケージの回避策はこれを修正します。

23
David Kean

代わりに Visual Studio 11の非同期ターゲットパック を使用してください。

Install-Package Microsoft.CompilerServices.AsyncTargetingPack

Microsoft.Bcl.Asyncプレリリースを使用する場合は、すべてのプロジェクトに追加する必要があります。 Bcl.Asyncの次のリリースでは、より詳細にメッセージングが改善されているはずです。

VS 2010を使用している場合、私が知っている唯一のことは、非同期/待機をAsyncCTPに与えることです。そのため、VS 2010でMicrosoft.Bcl.Asyncを使用しても意味がありません。

更新:

Microsoft.Bcl.AsyncへのWRT:MSB警告(「解決できない...間接的な依存関係...」に関する問題)は既知であり、解決されています。(MSBuildおよびMicrosoft.Bcl.Asyncへの)今後のアップデートでは、これにより修正する必要があります両方のプロジェクトにMicrosoft.Bcl.Asyncを含める必要はありません

4
Peter Ritchie