无法与Microsoft.AspNet.WebApi.Client一起加载文件或程序集'Newtonsoft.Json,Version = 6.0.0.0

问题描述 投票:5回答:2

我正在编写一个类库(称为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是一个包装器,它将一些托管代码公开给需要非托管代码的调用者(换句话说,预期本机DLL条目的位置)。

如果我通过NUnit测试方法测试mylibrary.dll的公共接口,则根本没有错误。但是,如果我通过targetapplication.exe的相同界面调用相同的方法,我会认识到以下情况:

  • 测试方法A:调用一个简单的JSON来进行字符串操作(使用Newtonsoft.JSON库)并运行得很好。
  • 测试方法B:调用执行PostAsync的方法

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

在幕后,ReadAsAsync调用使用Newtonsoft.JSON反序列化<T>类型的对象。看来这个函数是生成错误的函数:

无法加载文件或程序集'Newtonsoft.Json,Version = 6.0.0.0,Culture = neutral,PublicKeyToken = ...........'或其依赖项之一。定位的程序集的清单定义与程序集引用不匹配。 (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中管理的可装配重定向:

<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,错误告诉我的相同版本)的其他库中唯一的一个。似乎只是忽略了绑定重定向。因为它没有“文件未找到异常”我认为它能够找到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这样的调用编码 - >第三方文件 - >另一个第三方文件,这对于进一步开发来说真的没有有效的解决方案

c# dll reference json.net .net-assembly
2个回答
0
投票

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

<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 Package中的版本v8。您很可能指向许多Newton.Json DLL中的一个,即C:\ Program Files(x86)\ Microsoft ASP.NET \ ASP.NET Web Stack 5 \ Packages \ Newtonsoft.Json.6.0.3 \ lib \ net40。我不知道为什么会这样做,但我只有这个库的问题。


0
投票

更改

 <bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />

对于

 <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />

并检查您的依赖项Newtonsoft.Json。如果它有黄色图标,请将其删除并手动添加。 (确保添加6.0版本)。 (您应该在项目文件夹或其他项目中使用dll)。如果这不起作用,请通过NuGet添加旧版本(我预先自己手动添加它们)。

dll的位置通常是:C:\ Users \ Username \ Documents \ Visual Studio 2013 \ Projects \ ProjectFolder \ packages \ Newtonsoft.Json.6.0.8 \ lib \ net45(或任何版本的.net)

© www.soinside.com 2019 - 2024. All rights reserved.