【问题标题】:Could not load file or assembly System.Net.Http.Primitives. Located assembly's manifest definition does not match the assembly reference无法加载文件或程序集 System.Net.Http.Primitives。定位程序集的清单定义与程序集引用不匹配
【发布时间】:2013-08-24 14:07:24
【问题描述】:

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

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

我正在使用 Visual Studio 2012 express。我试过关注这个link 并浏览了许多论坛,但似乎都没有。主要问题似乎来自我引用的 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。

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

【问题讨论】:

  • 您好!你能在哪里解决这个问题?我也有同样的问题。谢谢!
  • 虽然我没有使用 Google API,但我收到了与 Web API 项目相同的错误消息。重建项目解决了这个问题。
  • 另一个明显的nuget dll地狱案例

标签: exception google-api-dotnet-client


【解决方案1】:

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

首先:更新到最新版本的 Google APIMicrosoft Http 客户端库。您可以通过 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>

【讨论】:

  • +1 第一步足以解决我的问题
  • 只是指出 Http.Primitives 版本是“2.2.22.0”,示例代码显示“4.0.10.0”。但这是正确的答案,应该被接受
  • Nuget 的要点是不需要在 Web.Config 中手动进行程序集绑定。我已经想念旧的 Google API。现在,如果我分发我的包装 DLL,我必须以某种方式通知他们为任何想要使用它的项目执行两个步骤。
  • 谢谢!这修复了错误“来自程序集'MyAssembly'的'MyClass'类型中的方法'MyMethod'没有实现。”仅在从 Google.Apis.Auth.Mvc4.dll 中的类型继承时出现。我所要做的就是将我的 app.config 中已有的 bindingRedirect 复制到我的 nunit 配置文件中。
  • 用 Nuget 更新(第一步)也为我解决了这个问题。
【解决方案2】:

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

【讨论】:

  • 安装后你使用了哪些命名空间?谢谢
  • 当我将它专门添加到我的测试项目(我遇到问题的地方)时,这对我有用,不管它已经在主项目中被引用,而主项目又被引用通过我的测试项目。
  • 为此,我必须在我们的解决方案中更新 nuget.exe - seirer.net/blog/2014/5/20/…
  • 安装包 Microsoft.Net.Http
  • Niether Microsoft.Net.Http 和 System.Net.Http nuget 包包括 System.Net.Http.Primitives.dll。不确定他们过去是否这样做。我的搜索还在继续。
【解决方案3】:

将以下内容添加到您的 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>

【讨论】:

  • 不确定你的oldVersion范围值和newVersion值,我的newVersion值是:2.2.29.0
  • 4.2.29 对我来说,目标是 .Net 4.5
  • 在我的情况下,创建的 vesrion nuget 指向 4.2.29,但我机器上的版本实际上是 4.2.13 (GAC_MSIL\System.Net.Http.Primitives) ...当我将重定向更改为 4.2.13,它开始工作了!不知道为什么会这样,但如果有人尝试了各种解决方法但仍然无法使其正常工作,那么值得在您的 GAC 中检查一下,看看您实际拥有的版本。
【解决方案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 现已更新。

【讨论】:

    【解决方案5】:

    我也遇到过类似的问题。

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

    /乔纳斯

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

        当我向我工作的公司发布使用 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 相关,但我不确定。您的里程可能会有所不同。

        【讨论】:

        • 很抱歉碰到这个问题,但这实际上是我唯一的解决办法。它解释了为什么它会在调试映射/调试模式而不是在已发布文件夹中运行。有什么办法可以防止这种情况发生吗?那里显示了很多信息,以便于获取,普通用户不会轻易访问。
        【解决方案8】:

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

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

        【讨论】:

          【解决方案9】:

          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/

          【讨论】:

            【解决方案10】:

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

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

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

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

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

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

            【讨论】:

              【解决方案11】:

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

              【讨论】:

                【解决方案12】:

                在我的例子中,我从一个类库中引用了 NuGet 包。 NuGet 无法通知我们类库的 app.config 被完全忽略,我们必须手动将其内容复制到 .exe 的 app.config。

                【讨论】:

                • 你在哪里可以找到图书馆的app.config?你复制了它的所有内容吗?
                • 一般在项目文件夹的根目录下,编译时复制到bin\Foo.dll.config。它们是 XML 格式,因此通常不能只是逐字复制附加。需要对它们进行比较,并单独复制缺失的部分。
                【解决方案13】:

                我在 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-client/issues/555

                【讨论】:

                  【解决方案14】:

                  安装包 Microsoft.Net.Http -Version 2.2.22

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

                  【讨论】:

                    【解决方案15】:

                    在我的例子中,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 的 ma​​chine.config 文件中。

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

                    【讨论】:

                    • @flyhorse1999,大约晚了一年,但请尝试我发布的解决方案。由于我需要删除一个属性,我的应用程序没有监听 bindingRedirects。
                    猜你喜欢
                    • 1970-01-01
                    • 2019-12-04
                    • 2021-10-15
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-10-30
                    • 2020-12-26
                    相关资源
                    最近更新 更多