16

Visual Studio 11 Beta を新しい Visual Studio 2012 RC にアップグレードしたところ、TPL データフローを参照する際に問題が発生しました。

まず、フレームワークからの参照を追加して、以前と同じように Dataflow を参照しようとしました。しかし、それをしようとすると、エラーボックスが表示されます:

「System.Threading.Tasks.Dataflow」への参照を追加できませんでした。

その後、Visual Studio 全体がフリーズします。

MEF および 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' への参照を追加する必要があります。

mscorlib にあるため、これは紛らわしいTaskです。他の参照は必要ありません。しかし、参照リストに呼び出された参照アセンブリがあるSystem.Threading.Tasksので、それを追加しようとしました。残念ながら、おなじみのエラーが表示されました。

「System.Threading.Tasks」への参照を追加できませんでした。

その後、Visual Studio が再びフリーズしました。

私は何か間違ったことをしていますか?VS 2012 RC で TPL データフローを使用するにはどうすればよいですか?

4

2 に答える 2

25

System.Threading.Tasks.dllから明示的に「参照を追加」してみてくださいC:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Facadesまたは、ディレクトリを使用することもできます。

更新:への参照の削除に関する回答を読んだ後、問題をさらに調査しましSystem.Runtimeた。次を追加できます。System.Runtime現在のバージョンのNuGetパッケージのエラーのため、への参照が追加されますMicrosoft.Tpl.Dataflow.4.5.1-rcSystem.Threading.Tasks.Dataflow.dllVisual Studioで直接同じものへの参照を追加した場合、参照System.Runtimeは追加されず、問題は発生しません。

NuGetパッケージエクスプローラーを使用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.dllMicrosoft.Tpl.Dataflowこのバグは、現在「NuGet公式パッケージソース」で入手可能なプレリリースバージョンのNuGetパッケージのメタデータにあります。

パッケージが修正されるように、バグレポートをautorsに投稿できます。

更新2:私の答えがすでに解決済みとしてマークされていて、賞金が与えられたとしても、問題はまだ私の頭から離れていません。実際には、2つの未解決の問題があります。

  1. 未使用のアセンブリが存在System.Runtimeすると、プロジェクトの構築中にエラーが発生する可能性があるのはなぜですか。
  2. NuGetパッケージのアンインストールまたは更新がどのように機能するかについていくつかの一般的な問題があります(詳細は後で参照してください)。

最初の問題が理由とは無関係に存在するという事実だけを受け入れましょう。2番目の問題は私を落ち着かなくさせます。ここに本当の問題があります。誰もが私をよりよく理解するために次の実験を行うことができます:

  1. Visual Studio2012RCで新しい空のコンソールアプリケーションを作成します。
  2. プロジェクトにへの参照がないことを確認しSystem.Runtimeます。
  3. 「ツール」/「ライブラリパッケージマネージャー」から「パッケージマネージャーコンソール」を開きます。
  4. 「パッケージマネージャーコンソール」でコマンド「Install-PackageMicrosoft.Tpl.Dataflow-Pre 」を実行します。
  5. System.Runtimeとの両方System.Threading.Tasks.Dataflowがプロジェクトの参照のリストに含まれていることを確認します。
  6. 「パッケージマネージャーコンソール」でコマンド「Uninstall-PackageMicrosoft.Tpl.Dataflow 」を実行します。
  7. System.Threading.Tasks.Dataflowプロジェクトの参照のリストから削除されているが、参照のリストSystem.Runtimeには残っていることを確認します。

もう1つの実験を行い、変更のバージョンを変更しました。ここで、へMicrosoft.Tpl.Dataflow.4.5.1-rc.nupkgの参照を削除し、System.Runtimeローカルに保存しました(下に保存されます)。その後、プロジェクトの更新リストに「新しい」バージョンが表示されました。4.5.1-rc4.5.1-rc1Microsoft.Tpl.Dataflow.4.5.1-rc1.nupkg

ここに画像の説明を入力してください

Updateをインストールすると、への参照System.Runtimeも削除されません。

したがって、NuGetの「更新」と「アンインストール」の現在の実装には、バグまたは一般的な設計上の問題があります。プロジェクトにパッケージを追加し、プロジェクトを更新すると、すべての古いバージョンのすべての依存アセンブリの参照が取得されます。NuGetによって古いバージョンのパッケージから追加された古い参照は、アンインストールまたは更新中に削除されません。まず第一に、プロジェクト参照にガベージを含めること自体は良くありませんが、最初の問題(参照されていない参照が存在する場合のコンパイル中のエラーSystem.Runtime)が存在するため、問題はさらに深刻になります。

したがって、NuGetで何も変更されない場合、の次のバージョンへの更新では、バージョン4.5.1(またはおそらく初期バージョン)Microsoft.Tpl.Dataflowでインストールしたユーザーの問題は解決されません。Microsoft.Tpl.Dataflowすべてのユーザーは、への参照をSystem.Runtime手動で削除する必要があります。NuGet開発者が解決しなければならないのは本当のNuGetの問題だと思います。問題の説明は後でhttp://nuget.org/に投稿します。

NuGetに投稿したバグレポートはここにあります(テキストのフォーマットが完全ではないことをお詫びします)。

于 2012-06-05T15:37:35.470 に答える
2

MS の Alok Shriram によると、解決策は System.Runtime への参照を削除することであり、これは次のリリースで修正される予定です。

参照を削除すると実際に問題が解決することを確認できます。

于 2012-06-07T18:59:26.113 に答える