4

Visual Studio 2012 C# コンソール アプリケーションで、".NET Framework Target" を 4.5 から 4.0 にダウングレードします。両方のフレームワークがインストールされた Win 7 Pro。

次に、アセンブリを参照します。アセンブリは、警告を通じて次のように訴えます。

The primary reference "System.Threading.Tasks.Dataflow, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" could not be resolved because it has an indirect dependency on the framework assembly "System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" which could not be resolved in the currently targeted framework. ".NETFramework,Version=v4.0". To resolve this problem, either remove the reference "System.Threading.Tasks.Dataflow, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" or retarget your application to a framework version which contains "System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".

この時点でコンパイルしようとすると、アセンブリがまったく参照されていないかのように、参照されているアセンブリの型と名前空間が利用できないため、エラーが発生します。

[参照の追加] ダイアログには System.Runtime の選択肢はありませんが手動で C:\Windows\Microsoft.NET\Framework\v4.0.30319\ に移動し、そこにある System.Runtime アセンブリを参照すると、警告が消えます。そして私はコンパイルすることができます。

質問:

  1. System.Runtime バージョンのそのような強制は、将来的に潜在的な問題になりますか (展開)。

  2. VS プロジェクトのプロパティがターゲット Framework 4.0 に設定されている場合 (4.0 SystemRuntime/CLR をターゲットにすることに関連していません)、参照された DLL がそれを取得しないのはなぜですか?また、プロジェクトへの参照を手動で追加するのはなぜですか?

4

2 に答える 2

5

ライブラリSystem.RuntimeC:\Windows\Microsoft.NET\Framework\v4.0.30319\ディレクトリ内にありますが、.NET 4.0 フレームワークの一部ではありません。.NET 4.5 は 4.0 のインプレース更新であり、同じバージョン番号で同じフォルダーにインストールされます。

ライブラリが play .NET 4.0 インストールに存在しないことを証明するスクリーンショットを次に示します。

プレーン 4.0 インストール

C:\Program Files (x86)\Reference Assemblies\Microsoft\Frameworkインストールされているすべてのフレームワーク バージョンの元のアセンブリを見つけるディレクトリを参照して、これを検証することもできます。およびサブディレクトリSystem.Runtime.dllの一部としてが見つかります。.NETCore\v4.5.NETPortable\v4.5

ライブラリをプロジェクトに追加できる理由は、ランタイムが 4.0 と 4.5 の間で変更されていないためです。そのため、手動で追加したライブラリが 4.5 によってインストールされていることを Visual Studio が認識したり、気にしたりすることさえありません。この場合、Visual Studio でのターゲット設定は、4.0 をターゲットとするプロジェクトに誤って 4.5 アセンブリを追加することを回避するフィルターにすぎません。

追加情報:

Rick Strahl は、このトピックに関するより詳細な分析を含む非常に優れたブログ投稿を行っています。

http://www.west-wind.com/weblog/posts/2012/Mar/13/NET-45-is-an-inplace-replacement-for-NET-40

于 2013-03-13T18:57:23.557 に答える
2

そのような System.Runtime バージョンの強制は潜在的な問題ですか

はい、これはうまくいきません。4.5がインストールされているため、マシンで動作します。4.0 しかないクライアント マシンでは、プログラムがクラッシュして焼き付きます。 Framework ディレクトリからの参照を追加しないでください。それらがまだ残っているのはかなり悲しいことです。彼らはあまりにも多くのプログラマーを困らせていますが、後方互換性は神聖なものです。

ビルド システムは、参照アセンブリを使用するときに問題があることを通知するだけです。[参照の追加] ダイアログに表示されるものは、c:\program files\reference アセンブリに格納されており、ランタイム アセンブリとは異なりますあなたはそれがうまくいくことを知っています、あなたは警告を受けました。これは、やや不器用な方法で、4.0 を搭載したマシンではプログラムが動作しないことを示しています。その警告を無視しないでください。そのアセンブリを使用するには、4.5 をターゲットにする必要があります。避けることのできない厳しい要件。

参照された DLL がそれを拾わないのはなぜですか

実行できないプログラムの構築を拒否するためです。機能であり、バグではありません。

于 2013-03-13T20:15:29.363 に答える