web-dev-qa-db-ja.com

Newtonsoft.json Assemblyパッケージのバージョンの不一致

.netでsocket.ioクライアントを作成するために SocketIO4Net を使用しようとしています。 Itseems SocketIO4Netには、Newtonsoft.Json> = 4.0.8の依存関係があります。私はまた、 PushSharp ライブラリを使用しています。私は最初にPushSharpをインストールしたときにNewtonSoft.Json 4.5.11を入手し、このバージョンはSocketIO4Netをサポートする必要があると考えましたが、socket.ioサーバーに接続しようとするとこのエラーが発生します。

ファイルまたはアセンブリ「Newtonsoft.Json、Version = 4.0.8.0、Culture = neutral、PublicKeyToken = 30ad4fe6b2a6aeed」またはその依存関係の1つをロードできませんでした。検出されたアセンブリのマニフェスト定義は、アセンブリ参照と一致しません。 (HRESULTからの例外:0x80131040)

私はこれらの依存関係の問題で一日中頭を叩いてきました。誰かが私を正しい方向に向けることができたらとても感謝しています。

23
Bitsian

解決策が見つかりました。試してください:

<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>
18
ZeroDotNet

アセンブリバインディング構成を変更し、リダイレクトを追加できます。 MSDNの アセンブリバージョンのリダイレクト を参照してください。

基本的に、次のスニペットをapp.configまたはweb.configファイル:

<configuration>
   <runtime>
     <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
       <dependentAssembly>
         <assemblyIdentity name="Newtonsoft.Json"
                           publicKeyToken="30ad4fe6b2a6aeed"
                           culture="neutral" />
         <!-- 
           Assembly versions can be redirected in application, 
           publisher policy, or machine configuration files.
         -->
         <bindingRedirect oldVersion="1.0.0.0-4.5.11.0" newVersion="4.5.11.0"/>
       </dependentAssembly>
     </assemblyBinding>
   </runtime>
</configuration>

[〜#〜] edit [〜#〜]

アセンブリバージョンをリダイレクトする必要があるのはなぜですか? SocketIO4NetはNewtonsoft.Jsonの新しいバージョンをサポートしていますが、単一のバージョン(4.0.8の場合)に対してコンパイルされています。このバージョンはDLLに保存され、SocketIO4Netが依存するDLLのロードに使用されます。

NuGetの依存関係はDLL /ランタイムの依存関係と同じではないことに注意してください-Newtonsoft.Json> = 4.0.8のNuGet依存関係は、Newtonsoft.Jsonの新しいバージョンを持つプロジェクトにSocektIO4Netをインストールできることを意味します。ランタイム設定とは関係ありません。

そうは言っても、プロジェクトにapp.configまたはweb.configファイルがある場合、最近のNuGetバージョンではAssembly-binding-redirectsが自動的に追加されるはずです。

6

上記のソリューションは正しいですが、忘れてはならないもう1つのポイントがあります。app.configコンテンツは上記のソリューションと同じでした。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

しかし、それが最新であるかどうかを確認することをお勧めします。私の場合、Newtonsoft.JSON(v.6.0.4)は別のパッケージに依存するようになりました。

enter image description here

2つのオプションがあります。

  1. (Newtonsoft.JSONパッケージ)最新バージョンを更新します。
  2. バージョン番号のapp.configファイルを更新します

最後のアドバイスとして、複数のプロジェクトで作業している場合、例えばexe-dllおよびNewtonsoft.JSONがある場合は両方のバージョンを確認します。

2
EgoistDeveloper

私は最近、古いプロジェクトに取り組んでいました。新しいバージョンを必要とする「新しい」APIを使用する必要があるため、Newtonsoft.Json.dllを更新する必要がありましたが、古いバージョンを必要とする他のDLLがまだありました。

bindingRedirectあなたは言いますか?いや。マニフェストの不一致について不平を言い続けました。

個別のcodeBaseタグ?いや。マニフェストの不一致について不平を言い続けました。

問題は、明らかにNewtonsoft.Json.dllの古いバージョン(3.0.0.0)にはPublicKeyTokenがありませんですが、「新しい」バージョン(4.5.7.1)はPublicKeyTokenがあります。したがって、同じdependentAssemblyタグを共有できませんでした。

これが私がやったことです:

<dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="" culture="neutral"/>
    <codeBase version="3.0.0.0" href="bin\Newtonsoft_Old\Newtonsoft.Json.dll" />
</dependentAssembly>
<dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
    <codeBase version="4.5.0.0" href="bin\Newtonsoft.Json.dll" />
</dependentAssembly>

これと同じ問題がありました。

ちょうどそれを解決しました。

NuGetを使用して、Newtonsoft.JSONに依存するExt.NETをインストールした後に発生しました。
デバッグ中にNuGetパッケージインストール手順を開始したことを確認せずに、/ bin(および明らかにweb.configファイル内の参照)フォルダにNewtonsoft.JSON.dllファイルがすでにありましたロックされていた)。

ランタイムエラーウィンドウでは、スタックトレースでマニフェストのどの部分に問題があるかがわかります。私のものはメジャーバージョンだったので、インストールパッケージのバージョンを確認しました。そしてそれは1つのメジャーバージョンアウトでした。 「[物理パス] /../ packages/Newtonsoft.Json。[バージョン]/lib/[。netバージョン] /」の下に元のNuGetファイルが見つかりました

マニフェストとライブラリの両方がそこにあったので、それを/ binフォルダーにコピーし、ルートweb.configアセンブリ情報を更新し、機能しました。

コードサンプル:前

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

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

お役に立てれば

1
Kickass

私の場合、NuGetでパッケージを削除し、新しいパッケージをインストールしました。次に、参照から参照を削除し、手動で再度追加します。魅力のように機能します。あなたのために解決を願っています。

1
Gerson C Filho

App/web.configにアセンブリリダイレクトを入れます。

   <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" PublicKeyToken="30ad4fe6b2a6aeed" />
        <bindingRedirect oldVersion="1.0.0.0-4.5.11.0" newVersion="4.5.11.0" />
      </dependentAssembly>

バージョン番号は、インストールしたバージョンと一致する必要があることに注意してください。

1
ChrisBint

他のソリューションはうまくいきませんでした。異なるnugetパッケージ(Newtonsoft.Json.Schema version = 3.0.0.0)がありましたが。
したがって、私のプロジェクトはASP .NETプロジェクトであり、Newtonsoft.Json.Schamaパッケージは.NET Standardプロジェクトで参照されていました。解決策は、NugetパッケージをWEB(またはスタートアップ)プロジェクトも問題を解決しました。

0
turanszkik

上記のエラーが発生しました:Visual Studio 2013で修正するには:パッケージmamnagerで実行:Install-package newtonsoft.jsonこれにより、packages.config <package id="Newtonsoft.Json" version="6.0.5" targetFramework="net45" />に新しい行が追加されます。 .config。 packagersディレクトリの古いバージョンのディレクトリを削除します。 NewtonSoft.Jsonの参照を削除し、最新バージョンを指すようにしました。すべてが完了すると、ルートwebconfigには次の<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />が含まれます。 Visual Studioを閉じて再度開きます。これで修正されるはずです。 PM> install-package durandal.starterkitのインストール時に同じエラーが発生しました。上記の方法を使用して修正しました。

0
Venkat

TeamCityでこれが起こっただけで、他の人もすぐにこれを経験すると思います。これはおそらく、NuGetパッケージをプルするほとんどのビルドサーバーに適用されます。

リダイレクトを行うと言う答えはすべて正しいです。ただし、正しいバージョン番号を引き続き定義する必要があります。私のプロジェクトはNewtonsoft.Json 7.0を使用していましたが、彼らは8.0をリリースしたばかりで、TeamCityはローカルではなくサーバーでのみ問題を引き起こしていた8.0をプルダウンしていました。すべてのリダイレクトは7.0に設定されました。

デプロイされたアプリケーションが、最新のものだけでなく、実際にNuGetから正しいバージョンを取得していることを確認してください。または、最新バージョンを指すように構成を更新します。

0
TyCobb