web-dev-qa-db-ja.com

Visual StudioがNewtonSoft.Json.DLLを古いバージョンで上書きし続ける

参照を含むWebサイト以外の他のプロジェクトをビルドすると、プロジェクト参照とNuGetパッケージファイルの両方で構成した正しいバージョンのNewtonSoft.Json.DLLがVisual Studioによって上書きされます。

OK。ここにシナリオがあります:

バックエンドサービスとウェブサイトを使用したソリューションがあります。 Webサイトは.NET 4.5で実行されており、NuGetでNewtonsoft.Json.DLLのバージョン6.0.1を取り込むように構成されています。

<package id="Newtonsoft.Json" version="6.0.1" targetFramework="net45" />

これにより、dependenAssemblyバインディングが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>

私は問題なくこのウェブサイトを構築して実行することができます。

最近、すべてのクラスライブラリとバックエンドサービスを.NET 4.0から.NET 4.5に更新しました。更新後、クラスライブラリの1つをビルドしたり、バックエンドサービスを実行/デバッグしたりすると、Webサイトが動作しなくなります。

Could not load file or Assembly 'Newtonsoft.Json' or one of its dependencies. The located Assembly's manifest definition does not match the Assembly reference. (Exception from HRESULT: 0x80131040)

これを追跡して、クラスライブラリの1つを再構築するか、Visual Studioからバックエンドサービスを実行/デバッグすると、Newtonsoft.Json.DLLがファイルの古いバージョン(バージョン4.5.11)で上書きされるという事実を突き止めました。明示的なdependentAssemblyバインディングのため、その後Webサイトにアクセスすると、上記の「ロードできませんでした...」エラーが発生します。

これは、バックエンドサービスまたはWebサイトのいずれかを実行したいだけの場合は問題ありませんが、アプリケーションを適切に実行するには、両方を同時に実行する必要があります。しかし、このエラーのため、ウェブサイトまたはウェブサイトがクラッシュすると同時にバックエンドサービスを実行することはできません。

Visual StudioがDLLを上書きしないようにするにはどうすればよいですか?

ソリューション全体で参照セットが6.0.1のみであることに注意してください(つまり、参照がないanywhereから4.5.11)。また、Webサイトでは、「ローカルのコピー」をtrueに設定し、Newtonsoft.Json.DLLの「特定のバージョン」もtrueに設定しています。

38
lecklind

これは 既知のバグWindows Azure VS Tools

回避策:

  • Newtonsoft.Json.dllファイルをProgram Files\Microsoft SDKs\Windows Azure.NET SDK\v2.3\ref \フォルダーから削除します。

  • Windows Azure VS Tools v 2.3をアンインストールする

28

問題

Csprojに、Newtonsoft.Json dllへの無効なパスを持つ参照が含まれています。私の場合、それは

<HintPath>..\..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll</HintPath>

nuGetの代わりにを設定する必要があります、packages\Newtonsoft.Json.8.0.3\...(バージョン番号を含む)。

VSはdllを見つけることができないため、システムを検索し、最初に見つけたDLLを使用します。私のシステムでは、それはAzure SDK 2.9、Azure SDK 2.8、そしてVS12/Blend/...でした。

ソリューション

上記の解決策のいくつか(システムで見つけたすべてのNewtonsoft.Json.dllを削除する)は、短期的に問題を隠す可能性がありますしかし、csprojを修正して正しいNuGet提供のパスを指すようにするだけで本当に解決します問題

つまり、csprojのHintPathがNuGetパッケージがインストールされているパッケージパスに対応していることを確認してください。

Bashをお持ちの場合は、

$ grep -r HintPath * | grep Newtonsoft

ソリューションのルートディレクトリで、問題のあるcsprojを見つけます。

関連するエラー

この問題がある場合、web.configで明示的なリダイレクトを使用してAsp.Netサイトを開始すると、例外メッセージが表示され、エラーメッセージに次のテキストが表示されることがあります。

ログ:新しいURL newtonsoft jsonのダウンロードを試みています

WRN:アセンブリ名を比較すると不一致になる:メジャーバージョン

一部のプロジェクトがNewtonsoft.Json 8.xのNuGetへの参照を持っている場合でも、VSは正常にコンパイルされ、システムで検出された古いものでDLLを上書きして失敗しますランタイム。

8
Wilbert

ここに私があった状況があります。
ソリューションの3つのプロジェクト。プロジェクトAとBはNewtonsoft.Json.DLL 6.0.3とプロジェクトCへのソリューション参照を参照しています。プロジェクトCにはNewtonsoft.Json.DLLへの明示的な参照はありません。
ソリューションをビルドすると、C、A、Bの順にビルドされます-正しいdllがビンにドロップされます。しかし、Cのみをビルドすると、VSは古いバージョンのdllをAとBにドロップします。明示的な参照またはバインディングリダイレクトが存在しないため、GACから取得しています。また、Aのみをビルドすると、古いdllがBにドロップされます。これは、最初にCをビルドして、誤ったバージョンをAとBにドロップしてから、Aをビルドして正しいバージョンを配置するためです。

これが解決策です-プロジェクトCにNewtonsoft.Json.DLL 6.0.3を明示的に追加します

5
nsb

最近、同じ問題に遭遇しました。私たちのソリューションは、開発マシン上で正しいDLLをコンパイルして持っていますが、ビルドエージェントでは、間違ったバージョンのNewtonsoft.Jsonが出力フォルダーにドロップされます。

多くの時間を費やした後、ビルドエージェントにローカルで持っていたよりも新しいバージョンのAzure SDK(2.5.1ではなく2.9)を誰かがインストールしたことが原因であることがわかりました。

私たちが発見した回避策は、プロジェクトに参照が必要ない場合でも、ソリューションのeveryプロジェクトにNewtonsoft.Json NuGetパッケージを含めることでした。

4
StilgarISCA

私はまったく同じ問題を抱えていて、C:\ Program Files\Microsoft SDKs\Windows Azure.NET SDK\v2.3\refにNewtonsoft.Json.dllがあり、日付と時刻がまったく同じであることがわかりました。私のウェブサイトのフォルダにコピーされました。

C:\ Program Files\Microsoft SDKs\Windows Azure.NET SDK\v2.3\refにあるNewtonsoft.Json.dllの名前を変更または削除した後、Visual Studioが停止して参照バージョンを置き換え、Webサイトが再び機能し始めました。

3
Patric Forsgard

今日も同じような問題に遭遇しました。クラスライブラリのビルド後、そのクラスライブラリの出力ディレクトリにあるすべての* .dllファイルが、そのクラスライブラリへのプロジェクト参照を持つWebプロジェクトのbinフォルダーにコピーされることを発見しました。これにより、互換性のあるアセンブリが互換性のないアセンブリに置き換えられる可能性があります。ただし、このdll xcopyは、Webプロジェクトがアンロードされている間は発生しません(プロジェクトを右クリックして[プロジェクトのアンロード]を選択します)。

2
erli

私は同じ問題を抱えていますが、すべてのソリューションをテストした後もエラーが発生し続けます。このエラーは複数の原因で発生する可能性があるようです。

私の場合、私はVS 2015を使用していますが、問題は、古いバージョンのnewtonSoftを使用するアプリケーション内の他のプロジェクトへの未使用の参照でした。参照を削除すると、dllは変更されなくなりました。

0
freedeveloper