68

我正在开发一个使用 Google API 的程序。但是每次我运行我的程序时,我都会收到以下错误:

无法加载文件或程序集“System.Net.Http.Primitives,Version=1.5.0.0,Culture=neutral,PublicKeyToken=b03f5f711d50a3a”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。

我正在使用 Visual Studio 2012 express。我试过关注这个链接并浏览了许多论坛,但似乎没有一个有效。主要问题似乎来自我引用的 DLL 文件“Google.Apis.dll”,它引用了 System.Net.Http.Primitives v1.5.0.0。但是我的程序引用的版本是 2.2.13.0。我尝试让程序引用 v1.5.0.0 代替(我设法找到了 dll 以及 Google.Apis 的源代码),但这只会导致另一个问题,我需要更新版本的 System.Net。 Http.Primitives。

我一直在尝试找到解决此问题的方法,但是我似乎找不到任何可行的方法。谢谢你的时间。

4

15 回答 15

71

我在使用 Google API 时遇到了同样的问题。这里的主要问题是,如果您安装Microsoft Http Client Libraries,它会将 System.Net.Http.Primitives DLL 的更新版本放入您的项目中。web.config 假定您仍在使用默认版本 1.5。修复它需要做两件事:

第一:更新到最新版本的Google APIMicrosoft Http Client Libraries。您可以通过 NuGet 安装更新。右键单击您的网站,单击“管理 NuGet 包”,选择左侧的更新。在这篇文章的时候,一些谷歌 API 只是预发布的。您可以通过 NuGet 安装它们,方法是选择更新屏幕左上角的“包括预发行版”。

第二次更新/添加一个dependentAssembly 到你的 web.config 中。为此,您需要知道已安装的 System.Net.HTTP.Primitives.dll 的版本。在 Windows 资源管理器中查看您的 bin 目录。找到 System.Net.HTTP.Primitives.dll,右键单击它,选择属性,然后单击“详细信息”选项卡。请注意位于那里的版本。在发表这篇文章时,我的是4.0.10.0

然后为正确的版本添加/更新一个dependentAssembly 部分。

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
      <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>
于 2013-10-18T19:27:57.910 回答
34

对我有用的是简单地从 Nuget 安装“Microsoft Http 客户端库”。

于 2013-10-16T19:14:28.003 回答
5

将以下内容添加到您的 web.config (app.config) 中:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
      <bindingRedirect oldVersion="0.0.0.0-4.2.13.0" newVersion="4.2.13.0"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>
于 2013-09-09T06:52:09.000 回答
4

对我来说,它的工作原理如下:

在 Visual Studio (2012) > 工具 > Nuget 包管理器 > 包管理器控制台上。在包管理器控制台顶部,我有包源:nuget.org 默认项目:需要 System.Net.Http.Primitives 的项目 使用编辑器在项目文件(yourproject.csproj)中查看我需要哪个版本(在我的案例是 Microsoft.Net.Http.2.2.28)

所以我去了https://www.nuget.org/packages/Microsoft.Net.Http/并点击了“版本历史”下的我的版本(如果你没有看到它,请滚动一下页面)。选择版本后,您复制建议的命令 - 在我的情况下是:

安装包 Microsoft.Net.Http -Version 2.2.28

但如果你需要最新版本就是这样:

安装包 Microsoft.Net.Http

并将其粘贴到之前打开的 Visual Studio 包管理器控制台上,如我之前所述。执行命令。

在引用下的项目中,System.Net.Http.Primitives 现在更新了。

于 2015-09-24T13:36:05.510 回答
2

我有一个类似的问题。

尝试更新 nuget(工具/扩展和更新......)为我解决了这个问题和其他一些问题。

/乔纳斯

于 2013-08-22T13:57:52.497 回答
2

我们遇到了类似的问题。但就我而言,Paul 修改 app.config 的解决方案不起作用。原因是我将它用作另一个应用程序中的插件。因此它考虑了该应用程序的配置文件。于是我们从 GitHub 上获取了 Google api 代码,在去掉了 System.Net.Http.Primitives 的依赖后构建了 Google.Apis.Core 库。然后我们使用了解决我们问题的dll。

于 2015-07-30T13:24:27.477 回答
2

当我向我工作的公司发布使用 Google.Apis.Drive.v2 (v1.9.2.1860) 的代码时,我遇到了这个问题。我给了他们 exe 和 Visual Studio(和 NuGet)生成的所有 DLL,他们得到了错误。我从来没有得到错误。

修复很简单(一旦我弄清楚了):从 Nuget 安装 api 时,会在输出(又名调试或发布)文件夹中自动生成文件“assemblyname.exe.config”。您所要做的就是在您在生成它的文件夹之外的某个位置运行程序集时包含该文件。这是我的该文件的代码:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.2.29.0" newVersion="4.2.29.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

这基本上是 Paul 的“第二个”修复,但它是由包管理器自动生成的。对我来说,问题是当我通过更新到 Google.Apis.Auth 和 Google.Apis.Core (v1.9.3) 来尝试他的“第一次”修复时,情况变得更糟了。我会得到同样的错误,除了现在它是因为“Google.Apis.Core”是错误的版本(尽管这可能也可以通过包含相同的 .exe.config 文件来解决。)

希望这对某人有所帮助,我知道这个线程已经很老了,但它是快速谷歌搜索引导我找到的那个。

编辑:忘了提,这与面向 .NET 4.5 的控制台应用程序有关。其中一些可能仍然与其他 .NET 目标或 ASP.NET 相关,但我不确定。你的旅费可能会改变。

于 2015-09-24T15:25:28.863 回答
1

以上关于程序集绑定的答案是正确的,但您不应该触摸 machine.config。

必须在引用您的库的项目的所有可执行程序集 (.exe.config) 的配置文件中设置程序集绑定,而不是在库程序集 (.dll.config) 中设置

于 2015-05-30T10:19:31.257 回答
1

NuGet 在 Web.Config 中进行了以下更改

<dependentAssembly> <assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.2.22.0" newVersion="4.2.22.0" /> </dependentAssembly>

<dependentAssembly> <assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.2.28.0" newVersion="4.2.28.0" /> </dependentAssembly>

这是在此包https://www.nuget.org/packages/Microsoft.AspNet.WebApi.MessageHandlers.Compression/的安装和后续删除(通过版本控制恢复)之后

于 2015-11-25T09:55:06.647 回答
0

不知何故,Paul Lemke 的流行回答对我不起作用。该项目是一个 webforms 应用程序,从 .net v 2.0 开始,并已升级到 .net 4.5 版

我更新了包,nuget 创建了正确的dependentAssembly/bindingRedirects。

根据一些评论,更改本地 machine.config 文件可能不是最好的主意。

显然,我的 web.config 文件中有一个属性导致应用程序忽略 bindingRedirects。

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">

我删除了那个 xmlns 属性,它开始工作了。

于 2015-07-20T23:08:00.127 回答
0

就我而言,我是从类库中引用 NuGet 包。NuGet 未能通知我们类库的 app.config 被完全忽略,我们必须手动将其内容复制到 .exe 的 app.config。

于 2015-10-22T18:43:30.933 回答
0

能够很容易地解决这个问题。刚刚打开 Nuget 包管理器并更新了 Microsoft ASP.NET Web API 2.2 客户端库包。这将 Microsoft.Net.Http 更新到了最新版本,解决了 System.Net.Http.Primitives 程序集无法定位的问题。希望这可以帮助!

于 2015-08-17T20:34:21.460 回答
0

我在 TFS 2017 的 PowerShell 脚本中遇到了类似的问题。这些脚本调用 .NET 代码来在构建过程中执行自定义操作。我不断收到有关 dll 版本冲突的错误。

在按照以下答案在 AppDomain AssemblyResolve 事件中实施挂钩之前,我无法解决该问题:Making binding redirects work for office add-ins

此解决方案强制进程使用当前路径中的 dll。我知道这有点 hack,但我已经读过,在运行 PowerShell 时,你不能总是使用绑定重定向,这是我最初虽然可以尝试的:https ://github.com/google/google-api-dotnet -客户/问题/555

于 2017-06-16T14:12:51.027 回答
0

安装包 Microsoft.Net.Http -Version 2.2.22

这个版本有那个dll \packages\Microsoft.Net.Http.2.2.22\lib\net45\System.Net.Http.Extensions.dll

于 2019-01-09T00:16:05.140 回答
-2

就我而言,Nuget 自动将以下内容添加到 web.config

<runtime xmlns="">
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.6.9.0" newVersion="2.6.9.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.6.9.0" newVersion="2.6.9.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.2.22.0" newVersion="2.2.22.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.1.10.0" newVersion="2.1.10.0" />
  </dependentAssembly>
</assemblyBinding>

但是我还是得到了上面的错误信息,最后我弄明白了。您必须将这些标签复制到位于 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config的machine.config文件中。

要在 machine.config 上找到“运行时”标签,请将其替换或添加(如果没有这样的标签)与您的 web.config 中的标签(我刚刚在上面列出的那些)。

于 2014-06-26T18:56:28.063 回答