【发布时间】: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