gpt4 book ai didi

c# - 无法结合 Microsoft.AspNet.WebApi.Client 加载文件或程序集 'Newtonsoft.Json,Version=6.0.0.0

转载 作者:太空狗 更新时间:2023-10-29 23:50:05 25 4
gpt4 key购买 nike

我正在编写一个类库(称为 mylibrary.dll),它本身引用了更多的库 -> 使用以下 DLL(从 package.config 中获取版本概述):

<package id="EntityFramework" version="6.0.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net45" />
<package id="Newtonsoft.Json" version="8.0.2" targetFramework="net45" />
<package id="System.Data.SQLite" version="1.0.99.0" targetFramework="net45" />
<package id="System.Data.SQLite.Core" version="1.0.99.0" targetFramework="net45" />
<package id="System.Data.SQLite.EF6" version="1.0.99.0" targetFramework="net45" />
<package id="System.Data.SQLite.Linq" version="1.0.99.0" targetFramework="net45" />
<package id="UnmanagedExports" version="1.2.7" targetFramework="net45" />`

mylibrary.dll 是一个包装器,它将一些托管代码公开给需要非托管代码的调用者(换句话说,其中需要 native DLL 条目)。

如果我通过 NUnit 测试方法测试 mylibrary.dll 的公共(public)接口(interface),则完全没有错误。但是,如果我通过来自 targetapplication.exe 的相同接口(interface)调用相同的方法,我会识别以下情况:

  • 测试方法 A:调用简单的 JSON 到字符串操作(利用Newtonsoft.JSON 库)并运行良好。
  • 测试方法 B:调用执行 PostAsync 的方法,此外

var vResponseObject = await vResponse.Content.ReadAsAsync<ApiResponse<T>>().ConfigureAwait(false);

在后台,ReadAsAsync 调用使用 Newtonsoft.JSON 反序列化 <T> 类型的对象.似乎这个函数是产生错误的函数:

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

HTTPContent.ReadAsAsync 由 Microsoft.AspNet.WebApi.Client(扩展 System.Net.Http)提供,它本身依赖于 Newtonsoft.JSON 版本 6.0.x(请参阅此包的 NuGet 依赖项)。未安装 6.0.x 版,而是 8.0.x 版。因此需要在 app.config 中管理的 assebly 绑定(bind)重定向:

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

现在我不知道如何解决这个问题。在我的项目中,Microsoft.AspNet.WebApi.Client 是唯一引用 Newtonsoft.JSON 的其他库(版本 6.0.x,与错误告诉我的版本相同)。似乎绑定(bind)重定向被简单地忽略了。因为它没有“文件未找到异常”我认为它能够找到 dll 的版本 8 但预期是 6,对吧?所有的 DLL 都在与 targetapplication.exe 相同的目录中

更新部分解决方案:作为一种解决方法,我能够通过 System.Net.Http.Formatting.dll 避免 Newtonsoft.Json 的外部调用

//vResponseObject = await vResponse.Content.ReadAsAsync<ApiResponse<T>>().ConfigureAwait(false);
string vStr = await vResponse.Content.ReadAsStringAsync();
vResponseObject = JsonConvert.DeserializeObject<ApiResponse<T>>(vStr);

但如果我必须围绕 mydll -> thirdparty.dll -> anotherthirdparty.dll 之类的调用进行编码,这对于进一步开发来说确实不是有效的解决方案

最佳答案

我刚刚使用 Newtonsoft 7.0.1 版解决了这个问题。我替换了我的 web.config 文件中的旧绑定(bind),这很奇怪:

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

收件人:

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

最后,将 Newtonsoft 引用从它指向的任何内容更改为 NuGet 包中的版本 v8。您很可能指向许多 Newton.Json DLL 之一,即 C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Stack 5\Packages\Newtonsoft.Json.6.0.3\lib\net40。我不知道它为什么这样做,但我只遇到过这个库的问题。

关于c# - 无法结合 Microsoft.AspNet.WebApi.Client 加载文件或程序集 'Newtonsoft.Json,Version=6.0.0.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35579453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com