新しいASP.NET MVC 5プロジェクトのNuGetパッケージ参照を更新した後、JSON.NETとのアセンブリバージョンの競合を修正するにはどうすればよいですか?


89

VS 2013(Update 1)で新しいASP.NET MVC 5 Webプロジェクトを作成し、すべてのNuGetパッケージを更新しました。プロジェクトをビルドすると、次の警告が表示されます。

警告MSB3243:「Newtonsoft.Json、Version = 6.0.0.0、Culture = neutral、PublicKeyToken = 30ad4fe6b2a6aeed」と「Newtonsoft.Json、Version = 4.5.0.0、Culture = neutral、PublicKeyToken = 30ad4fe6b2a6aeed」の間の競合を解決する方法はありません。

しかし、web.configを確認すると、バインディングリダイレクトが設定されていることがわかります。

  <dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
  </dependentAssembly>

これはまさに警告が忠告するものです。

この警告を修正するにはどうすればよいですか?


はい、完全に再構築しました。また、NuGetを最新に更新し、新しいソリューションを作成して、まったく同じ問題を再現しました。
ジムラム2014

回答:


106

ここで私が警告を修正するために使用した手順:

  • VSでプロジェクトをアンロード
  • .csprojファイルを編集する
  • Newtonsoft.Jsonアセンブリへのすべての参照を検索します
    • 1つはv6に、もう1つはv5に2つ見つかりました
    • v5への参照をv6に置き換えます
  • プロジェクトを再読み込み
  • アセンブリ参照の失敗をビルドして通知する
  • 参照を表示して、Newtonsoft.Jsonに2つあることを確認します。解決できないものを削除します。
  • 再構築-警告なし

12
2つの参照を見つけました。1つはv6用で、もう1つはv5用ですが、v5の1つを削除しました(置き換えません)。その後、UIで「アセンブリ参照の失敗」やNewtonsoft.Jsonへの2つの参照などの問題は発生しませんでした。私は推測誰かが詰まっinstall.ps1
ta.speot.is

解決策をありがとう。私も古い参照をプロジェクトファイルから削除しましたが、問題はありませんでした。
Charles Prakash Dasari、2014

31
+1-このようなことをしなければならないとき、それは本当に私を狂わせます。そのため、私は常にnugetパッケージマネージャで[アップグレード]をクリックするのをためらっています。
hylander0 2014年

1
私はこの問題を抱えていて、そこにあるとは知らなかった余分な参照を削除することで修正しました。これは、そこにある余分な参照の根本原因であるMicrosoft Connectバグへのリンクです:connect.microsoft.com/VisualStudio/feedback/details/816725/…
Martin Costello

1
私の場合、バージョン6.0について文句を言っていましたが、Newtonsoft.Json 11.0.1と11.0.2の2つの異なるバージョンへの参照がありました。
Daniel Lobo

31

Newtonsoft.Json 4.5.6への参照を持つMicrosoft.AspNet.WebApiを含むパッケージを更新し、すでにバージョン6をインストールしているため、この問題が発生しました。バージョン6を使用するには十分な賢さではありませんでした。

これを解決するには、WebApiの更新後、[ツール]> [NuGetパッケージマネージャー]> [Pacakge Managerコンソール]を開いて実行しました。

 Update-Package Newtonsoft.Json

ログは、6.0.xと4.5.6のバージョンがすべて最新のものに更新されており、すべて問題がないことを示していました。

これがまた出てくる気がします。


1
私のソリューションに複数のプロジェクトを含む複数の異なるバージョンの問題がありました。これにより完全に修正され、すべてを最新のJSON.netに更新しました。いいね!
c0d3p03t 2014年

1
これは、私の問題を解決する最も簡単で簡単な解決策でした。ありがとう!
youngrrrr

21

このセクションをプロジェクトファイルから削除すると、問題が解決することがわかりました。

<ItemGroup>
<Reference Include="Newtonsoft.Json">
  <HintPath>..\packages\Newtonsoft.Json.6.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>


これだよ。Newtonsoft.Json.6.0.1 / 6.0.3 / 6.0.5のいずれもバインディングリダイレクト '' oldVersion = "0.0.0.0-6.0.0.0" ''に一致しないと思いますが、正しいものを書く方法がわかりません
ファンタジー

これも私の問題でした。何が追加されたのかわかりません。
amnesia 2017

私のために働いた。v6.0とv12.0の競合に関連するエラー。アイテムグループの参照はv11.0でした。したがって、何が起こっているのかはわかりませんが、コンパイルエラーを削除する限り、アイテムグループを削除すると問題が解決したようです。
Brian.S

13

上記のいずれも機能しない場合は、web.configまたはapp.configでこれを使用してみてください。

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30AD4FE6B2A6AEED" culture="neutral"/>
            <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>

これは、より高いバージョンを使用している既存のプロジェクトがあり、同じパッケージの古いバージョンを使用している依存関係を追加する場合に最適であり、古いバージョンを新しいバージョンにリダイレクトします。
Ismail Hawayel

13

Newtonsoft.Json 11.0.1から12.0.2にアップグレードしました。Notepad ++でプロジェクトファイルを開く

<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
      <HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
    </Reference>

そして

<ItemGroup>
    <Reference Include="Newtonsoft.Json">
      <HintPath>..\packages\Newtonsoft.Json.11.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
    </Reference>
  </ItemGroup>

バージョン11.0.1へのヒントパスで参照をラップするItemGroupを削除しました。

これらの問題を見つけるのはめちゃくちゃイライラすることがあります。さらに、開発者は以前のプロジェクトのセットアップと同じ手順に従うことがよくあります。以前のセットアップでは問題は発生しませんでした。何らかの理由で、プロジェクトファイルが誤って更新されることがあります。

マイクロソフトがこれらのビジュアルスタジオDLLの地獄の問題を解決することを切に願っています。それはあまりにも頻繁に起こり、それが修正されるまで、多くの場合試行錯誤によって進行が止まってしまいます。


1
これはまさに問題でした。ありがとう!
ジョージファビッシュ

8

アセンブリリダイレクトエラーの最終的な解決策

さて、うまくいけば、これは解決に役立つはずです すべての(正常な)アセンブリ参照の矛盾です...

  1. エラーを確認してください。

ウェブサイトにサーフィンする

  1. アセンブリのリダイレクト後にweb.configを確認してください。存在しない場合は作成してください。

既存のweb.configアセンブリのリダイレクト

  1. アセンブリの参照を右クリックし、[プロパティ]を選択します。

参照リストのアセンブリ、関連プロジェクト

  1. プロパティテーブルでバージョン(ランタイムバージョンではない)を確認します。了解。

アセンブリのバージョンを示すプロパティテーブル

  1. newVersion属性に貼り付けます。

更新されたnewVersionによるweb.configアセンブリのリダイレクト

  1. 便宜上、oldVersionの最後の部分を、丸くて架空の何かに変更します。

更新されたoldVersionによるweb.configアセンブリのリダイレクト

喜ぶ。


この答えは私に大きな時間を節約しました!カスタムC#ライブラリを使用しているWebアプリケーションがあり、どちらも同じnugetパッケージを使用していましたが、Webアプリケーションのバージョンがライブラリよりも古いため、ライブラリに使用していたバージョンがリダイレクトに含まれていませんでした。
戦争グレイビー

4

バインディングリダイレクトで

oldVersion = "0.0.0.0-6.0.0.0"

古いバージョンのdllはバージョン0.0.0.0とバージョン6.0.0.0の間にあると言っています。


1
oldVersionここで実際には少し間違っていますが、あなたが言っているのは、あなたの言っていることは、あなたのアセンブリ/ exeが範囲内のバージョンへの参照でビルドされ0.0.0.0-6.0.0.0、実際にインストールされた(そして好ましい)バージョンがnewVersion(古いバージョンが「期待されるバージョン」と新しいバージョンは「実際に利用可能なバージョン」としてより適切に表現されます)
必要ありません

2

私の理解では正しい解決策である次のことについて誰も言及していません:

nugetがインストールされているプロジェクトのcsprojに移動し、をに設定AutoGEneratedBindingRedirectsfalseます。

<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>

MSDNの完全な記事。


1

パッケージを更新して再インストールしましたが、OPとまったく同じエラーが発生しました。次のようにして、参照されているdllを手動で編集しました。

参照からnewtonsoft.json.dllを削除してから、binディレクトリから.dllを手動で削除しました。次に、nutonパッケージフォルダーからプロジェクトビンにnewtonsoft.json.dllを手動でコピーし、.dllファイルを参照して参照を追加しました。

今私のプロジェクトは再びビルドされます。


0

私は同様の問題があり、私の状況で他の人に答えを投稿したかっただけです。

他の複数のC#クラスlibプロジェクトでASP.NET Webアプリケーションを実行するソリューションがあります。

私のASP.NET Webアプリケーションはjsonを使用していませんが、他のプロジェクトでは使用しています。

これは私がそれを修正した方法です:

  1. jsonの任意のバージョンを現在使用しているすべてのプロジェクトでNuGet Updateを使用して最新バージョン(6)を使用するすべてのプロジェクトを確認しました-これで問題は解決しませんでした
  2. NuGetを使用してjsonをWebアプリケーションに追加しました-これで問題が解決しました(理由を詳しく説明します):

ステップ2は、まずjsonの構成情報を追加することでした。つまり、プロジェクトのバージョンに関係なく、すべてのプロジェクトで最新バージョン(6)を使用することをお勧めします。おそらく、アセンブリバインディングをWeb.Configに追加することで修正されます。

ただし、ステップ2ではsomレガシーコードもクリーンアップされました。以前、Webアプリケーションでjsonの古いバージョン(5)を使用しており、参照が削除された(疑わしい:手動で)ときにNuGetフォルダーが削除されなかったことがわかりました。最新のjson(6)を追加し、古いフォルダー(json v5)を削除しました。これも修正の一部である可能性があります。


0

Veverkeは、AutoGEneratedBindingRedirectsをfalseに設定することでバインディングリダイレクトの生成を無効にできると述べました。この質問が投稿されて以来、それが新しいものかどうかはわかりませんが、[ツール] / [オプション] / [Nugetパケットマネージャー]に[スキップバインディングリダイレクトの適用]オプションがあり、これを切り替えることができます。デフォルトではオフです。つまり、リダイレクトが適用されます。ただし、これを行う場合は、必要なバインディングリダイレクトを手動で管理する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.