33

我在我的项目中使用 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)

我在互联网上搜索并找到了一些更改配置文件的解决方案。所以我改变我的配置文件如下

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

我还玩弄诸如复制本地、特定版本之类的程序集属性,但没有什么能帮助我解决这个问题。如何解决装配冲突?

4

5 回答 5

62

我刚刚遇到了同样的问题,我通过使用将 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>
于 2013-12-06T02:16:32.077 回答
35

+1 给 zbarrier 的解决方案。这就是它起作用的原因...

+1 给 zbarrier 的回答,帮助我解决了我的问题。装配参考问题是最糟糕的......所以我想我会发布我采取的步骤,以及我学到的一些东西,希望它有所帮助:


  1. 失败的尝试:将以下行粘贴到我的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>
    

    ^^^^^ 没有工作


  1. 解决方案:导航到~/Bin/Newtonsoft.Json.dll,并在 Visual Studio 中打开文件。汇编文件接口默认情况下,文件界面显示一个以程序集命名的文件夹——我双击它展开,最终看到1 [Neutral]汇编文件信息

    这行Assembly Version是您需要输入标签newVersion属性的内容。<bindingRedirect>所以我拿了我粘贴的部分(在第一步中)并将“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>
    

    ^^^^^ 成功了!!最后...


如果有人仍然感到困惑,其他说明:

  • 该标签位于 web.config 中的标签<runtime>内。<configuration></configuration>我上面显示的部分直接粘贴在我的 web.config<configuration>部分的开始标记下方。
  • xmlns属性表示相应的 XML 命名空间。程序集的开发人员使用它来避免标签冲突的问题。在这种情况下,您应该觉得使用 xmlns="schemas-microsoft-com:asm.v1"上面列出的方法是安全的。
  • 您可以更改该oldVersion属性以转发程序集的其他版本。例如,我可能会编辑我的看起来更像zbarrier 的答案
  • publicKeyToken是另一个在 Newtonsoft.Json 中几乎保持不变的属性。publicKeyToken 只是公钥的缩短版本——就像书名是书名一样——在这种情况下并没有真正改变。如果您想知道程序集的公钥,只需打开Developer Command Prompt可以在开始菜单中找到的公钥,然后使用命令提示符导航到程序集文件的位置(在本例中~\Bin\),然后运行 ​​sn - T assembly_file_name命令。所以在这种情况下,命令是sn -T Newtonsoft.Json.dll。您应该得到这样的响应:sn 命令响应如您所见,Newtonsoft 公钥 ( 30ad4fe6b2a6aeed ) 就在最后。
于 2015-02-19T17:04:39.067 回答
23

我在程序集版本 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>
于 2014-02-07T23:36:06.023 回答
3

起初,我认为我的案例是相同的旧程序集参考......卸载,重新安装,强制安装,重建,添加重定向程序集......等等

没有任何效果,直到我发现另一个程序集导致了问题。

就我而言,当我调用 HttpClient.PostAsJsonAsync(requestURI, T) 方法时,我的代码失败了。由于我的解决方案有多个项目并且其中一些项目使用了旧版本,因此关于 Assembly Reference 的错误让我失望了......最终浪费了很多时间,直到......

我的解决方案:

  • 从我的参考资料中删除了现有的 System.Net.Http.Formatting
  • 安装了安装包 Microsoft.AspNet.WebApi.Client - 它安装了所需的 Http.Formatting。

安装后, PostAsJsonAsync() 按预期工作!

希望这可以节省我寻找解决方案的时间!

于 2015-09-29T16:22:34.560 回答
0

我遇到了同样的问题,我已经安装了 Newtonsoft.Json v9.0.1 ,sandcastle 停止构建显示相同的错误但版本不同:“无法加载文件或程序集'Newtonsoft.Json,版本 = 6.0.0.0”

什么有效:使用 newtonsoft.json 找到/创建一个项目,该项目的版本是 SandCastle 要求的,添加文件“Newtonsoft.Json.dll”作为对 SC 项目的引用,然后构建。(你可以在项目的bin文件夹中找到dll)

于 2016-07-19T11:13:28.693 回答