【问题标题】:Microsoft.Net.Http library conflict between MVC project and PCLMVC项目和PCL之间的Microsoft.Net.Http库冲突
【发布时间】:2016-09-27 23:05:31
【问题描述】:

我正在为我的 WebApp 和 PCL 使用 Microsoft HTTP Client Libraries 2.2.29。

这里是链接:https://www.nuget.org/packages/Microsoft.Net.Http/

由于兼容性,PCL 使用 System.Net.Http.Primitives.dll 版本 1.7.29

MVC 项目正在拉 System.Net.Http.Primitives.dll 版本 4.2.29,因为它与 4.5 框架兼容。它还依赖于我的 PCL。

如果我只构建我的 WebApp,它可以正常工作,因为它会提取 4.2.29 版本。但是,如果我构建另一个依赖于我的 PCL 的项目(例如 Xamarin APP),它会将 1.7.29 版本扔到 web/bin 文件夹中,并且我在 Web 项目上收到以下错误。

[FileLoadException: 无法加载文件或程序集 'System.Net.Http.Primitives,版本=4.2.29.0,文化=中性, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。这 定位程序集的清单定义与程序集不匹配 参考。 (HRESULT 异常:0x80131040)]
System.Reflection.RuntimeAssembly._nLoad(AssemblyName 文件名,字符串 codeBase,证据 assemblySecurity,RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean for Introspection, Boolean 抑制安全检查)+0
System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef,证据 assemblySecurity,RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean for Introspection, Boolean 抑制安全检查)+234
System.Reflection.RuntimeAssembly.InternalLoad(字符串组装字符串, 证据组装Security、StackCrawlMark& stackMark、IntPtr pPrivHostBinder,用于自省的布尔值)+108
System.Reflection.RuntimeAssembly.InternalLoad(字符串组装字符串, 证据组装Security, StackCrawlMark& stackMark, Boolean forIntrospection) +25 System.Reflection.Assembly.Load(String 组装字符串)+34
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(字符串 assemblyName, Boolean starDirective) +49

我的 web.config 中有以下配置:

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

PCL 包.config

<package id="Microsoft.Net.Http" version="2.2.29" targetFramework="portable45-net45+win8+wp8+wpa81" />

WebAPP packages.config

 <package id="Microsoft.Net.Http" version="2.2.29" targetFramework="net451" />

我可以删除 web.config 配置以使其适用于版本 1.7.29。但是我不想这样做,我想使用每个项目的这个库的最新兼容版本。

为什么在我构建不相关的项目时,VS 2015 社区版/nuget 会将不兼容/较低版本的库放入 web/bin 文件夹中?

我该如何解决这个问题?

【问题讨论】:

  • 你最好让 MSBuild 给你诊断。否则,不清楚是谁抄袭了旧版本。
  • 如何设置 PCL 项目目标?我创建了一个面向 .NET 4.5、Windows 8、Windows Phone 8 和 Xamarin Android 的示例 PCL 项目。安装 Microsoft HTTP Client Libraries 2.2.29 后,System.Net.Http.Primitives.dll 版本为 1.5.9。而且我没有在我的 WebApp 中设置 bindingRedirect,我的 Xamrin 应用程序和 Web 应用程序都可以成功构建。你能在这里分享一个示例项目来重现这个问题吗?
  • @Wendy 请在此处查看github.com/reyou/CrossLibraryReference 下载此项目并首先构建 Web 应用程序并检查 bin 文件夹,然后构建类库 2 并再次检查 bin 文件夹。如果可能,请尝试使用 VS 2015 社区版。这是我的经验:github.com/reyou/CrossLibraryReference/tree/master/debugImages 这次它发生在“System.Net.Http.Extensions.dll”
  • 对于您的示例解决方案,它在我身边运行良好。 Http.Extensions.dll 和 Http.Primitives.dll 在 Web 项目和 ClassLibrary2 项目中都使用高版本。我先构建 Web 应用程序,然后在 Web 应用程序中引用 ClassLibrary2 并再次构建。 dll版本相同。我的步骤有问题吗?而且我也没有在您的 Web.config 文件中找到 节点。请检查您的示例解决方案,是否有任何遗漏。
  • @Wendy 我会尝试为我正在采取的步骤录制视频。简单地说,我会做,克隆 git repo,用 vs 2015 CE 打开,构建 web 应用程序,检查 web/bin 文件夹中的“System.Net.xxx”参考版本。然后构建类库 2 并在 web/bin 文件夹中再次检查“System.Net.xxx”参考版本。

标签: .net visual-studio-2015 nuget portable-class-library


【解决方案1】:

我知道这不是一个经过验证的解决方案,但是我必须从解决方案中一个一个删除项目并重新添加。然后我通过右键单击项目并选择对它们的依赖项来重新映射项目依赖项。似乎现在正在工作。当超过 3 个项目相互交叉引用时,VS 构建顺序可能会出现问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多