web-dev-qa-db-ja.com

Newtonsoft.Json Assembly Conflict

私はプロジェクトでNetonsoft.Jsonを使用しています。プロジェクトにPaypal SDKの統合を開始するまで、問題なく機能します。私のコードは以下の通りです。

         String AccessToken =
  new Paypal.OAuthTokenCredential("", "").GetAccessToken(); ---->>>> This Line Throwing An Error
            Paypal.Api.Payments.Address add = new Paypal.Api.Payments.Address();
            add.city = TextBoxCity.Text;
            add.line1 = TextBoxAddress.Text;
            add.phone = TextBoxPhoneNumber.Text;
            add.postal_code = TextBoxZipcode.Text;
            add.state = TextBoxState.Text;
            Paypal.Api.Payments.CreditCard cc = new Paypal.Api.Payments.CreditCard();
            cc.number = TextBoxCreditCardNumber.Text;
            cc.first_name = TextBoxFirstName.Text;
            cc.last_name = TextBoxLastName.Text;
            cc.expire_month = Convert.ToInt16(TextBoxExpiryMonth.Text);
            cc.expire_year = Convert.ToInt16(TextBoxExpiryYear.Text);
            cc.cvv2 = TextBoxCVVNumber.Text;
            cc.billing_address = add;
            cc.Create(AccessToken);

そして、私は以下のようにエラーが発生します

       System.IO.FileLoadException: Could not load file or Assembly 'Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located Assembly's manifest definition does not match the Assembly reference. (Exception from HRESULT: 0x80131040)

インターネットで検索したところ、設定ファイルを変更するためのソリューションが見つかりました。 SO以下のように設定ファイルを変更します

        <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
     <bindingRedirect oldVersion="0.0.0.0-3.5.0.0" newVersion="4.5.0.0" />
  </dependentAssembly>
</assemblyBinding>

ローカルのコピー、特定のバージョンなどのアセンブリプロパティも試してみましたが、これを解決するのに何も役立ちません。アセンブリの競合を解決するにはどうすればよいですか?

31
Hiren

私は同じ問題を抱えていたので、Newtonsoft.Jsonを使用して最新バージョンに更新しました

Update-Package Newtonsoft.Json

次に、Web.configに移動して以下を追加します。

<dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed"/>
    <bindingRedirect oldVersion="0.0.0.0-4.5.0.0" newVersion="5.0.8"/>
</dependentAssembly>
62
Harold

彼の解決策のためにzbarrierに+1。これが機能した理由です...

私の問題を解決するのに役立った彼の答えをzbarrierに+1しました。アセンブリ参照の問題は最悪です...だから、私が学んだいくつかのことと同様に、自分がとったステップを投稿すると思いました。


  1. FAILED ATTEMPT:次の行を_web.config_に貼り付けました:

    _<runtime>
        <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed"/>
            <bindingRedirect oldVersion="0.0.0.0-4.5.0.0" newVersion="5.0.8"/>
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
    _

    ^^^^^ DID NOT WORK


  1. SOLUTION:_~/Bin/Newtonsoft.Json.dll_に移動し、Visual Studioでファイルを開きました。デフォルトでは、ファイルのインターフェイスにはアセンブリにちなんで名付けられたフォルダが表示されます。ダブルクリックして展開すると、最終的には次のように表示されます。 Assembly-file interface 次に、_1 [Neutral]_アイコンをダブルクリックして、アセンブリの情報に移動しました。これを次に示します。 Assembly-file information

    _Assembly Version_という行は、_<bindingRedirect>_タグのnewVersion属性に入力する必要があるものです。そこで、(ステップ1で)貼り付けたセクションを取り上げ、「5.0.8」を「6.0.0.0」に変更しました。私の新しい_<runtime>_セクションは次のようになります。

    _  <runtime>
        <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed"/>
            <bindingRedirect oldVersion="0.0.0.0-4.5.0.0" newVersion="6.0.0.0"/>
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
    _

    ^^^^^うまくいきました!!最後に...


まだ混乱している場合のその他の注意:

  • _<runtime>_タグは、web.configの_<configuration></configuration>_タグ内に入ります。上記のセクションは、web.configの_<configuration>_セクションの開始タグのすぐ下に貼り付けられました。
  • xmlns属性は、対応するXML名前空間を表します。これは、アセンブリの開発者がタグの競合の問題を回避するために使用します。この場合、上記の_xmlns="schemas-Microsoft-com:asm.v1"_を使用して安全に感じる必要があります。
  • oldVersion属性を変更して、アセンブリの追加バージョンを転送できます。たとえば、おそらく zbarrier's answer のように編集します。
  • publicKeyTokenは、Newtonsoft.Jsonに関してはほとんど変わらない別の属性です。 publicKeyTokenは、タイトルが本のようになっているように、公開キーの短縮バージョンにすぎません。この場合、実際には変わりません。アセンブリの公開キーを知りたい場合は、スタートメニューにある_Developer Command Prompt_を開き、コマンドプロンプトを使用してアセンブリファイルの場所に移動します(この場合は_~\Bin\_)、sn -T Assembly_file_nameコマンドを実行します。したがってこの場合、コマンドはsn -T Newtonsoft.Json.dllでした。次のような応答が返されます。 sn command response ご覧のとおり、Newtonsoftの公開キー(30ad4fe6b2a6aeed)は最後にあります。
33
Lopsided

Assemblyバージョン6.0.1でも同じ問題に遭遇しました。 Haroldの指示に従って、web.configに次の行を貼り付けました。

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

次に、Newtonsoft.Jsonへのプロジェクト参照を削除し、packages.configファイル内のNewtonsoft.Jsonへの参照を削除しました。

Nuget Managerを開き、Newtonsoft.Jsonを再インストールしました。

インストールにより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>
23
zbarrier

最初は、私のケースは同じ古いアセンブリ参照であると思いました...アンインストール、再インストール、強制インストール、再構築、リダイレクトアセンブリの追加などを行いました

別のアセンブリが問題を引き起こしていることがわかりました。

私の場合、HttpClient.PostAsJsonAsync(requestURI、T)メソッドを呼び出したときにコードが失敗していました。私のソリューションには複数のプロジェクトがあり、一部のプロジェクトでは古いバージョンが使用されていたため、Assembly Referenceに関するエラーが発生しました...

私の解決策:

  • 参照から既存のSystem.Net.Http.Formattingを削除しました
  • Install-Package Microsoft.AspNet.WebApi.Clientをインストールしました。これにより、必要なHttp.Formattingがインストールされました。

インストールすると、PostAsJsonAsync()は期待どおりに機能しました!

これにより、解決策を探すのに失った時間を節約できることを願っています!

2
Gotcha

私は同じ問題に直面し、Newtonsoft.Json v9.0.1をインストールしました。サンドキャッスルは同じエラーを表示しながらビルドを停止しますが、バージョンの違いは「ファイルまたはアセンブリ 'Newtonsoft.Json、Version = 6.0.0.0をロードできませんでした」

動作:SandCastleが要求しているバージョンのnewtonsoft.jsonでプロジェクトを検索/作成し、ファイル「Newtonsoft.Json.dll」をSCプロジェクトへの参照として追加してからビルドします。 dllはプロジェクトのbinフォルダーにあります)

0
Apex ND