【问题标题】:Building a library targeting different versions of .NET构建针对不同版本 .NET 的库
【发布时间】:2018-08-30 01:31:54
【问题描述】:

我有一个库,用于通过执行如下命令行来针对不同版本的 .NET 构建:msbuild x.csproj /p:TargetFrameworkVersion=v4.6.2 ... 多次使用不同的属性 TargetFrameworkVersion 值。现在我想将 .NET 4.7.1 添加到脚本中。 4.7.1 的构建成功,但下一个构建失败并显示如下消息:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\NuGet\15.0\Microsoft.NuGet.targets(186,5): 错误:您的项目没有引用“.NETFramework ,Version=v4.6.2" 框架。在 project.json 的“frameworks”部分添加对“.NETFramework,Version=v4.6.2”的引用,然后重新运行 NuGet 还原。 [x.csproj]

我搜索了很多此消息,但找不到任何可以修复我的构建脚本的有用解决方案。最接近解决方案的是this。但是在每个 msbuild 之前删除 project.assets.json 并没有帮助。显然,为不同版本的 .NET 还原 NuGet 包存在问题。 能否请您提出解决方案。

【问题讨论】:

  • 顺便说一句,为什么您需要针对不同版本的 .NET 进行构建?在大多数情况下,您应该针对单个 .NET Framework 版本进行编译,然后针对其他平台(例如 .NET Standard、Xamarin)进行编译。你现在所做的没有真正的价值。
  • 您是否尝试过手动删除该项目的 bin 和 obj 文件夹,而不仅仅是清理构建?
  • @Lex Li,因为有些人在使用该库的旧 .NET(例如 4.5)上,但我想继续前进并保持最新状态。
  • @Leo Liu,是的,我试过了,效果和只删除 project.json 文件一样:在 4.7.1 上有效,在早期版本上失败。
  • 基于 .NET Framework 4.5 构建的程序集可以在更高版本上完美运行(除非您真的想针对某些非常特殊的情况进行有条件编译)。

标签: .net msbuild visual-studio-2017 nuget .net-4.7.1


【解决方案1】:

好的,我最终做的是在项目文件的第一个 PropertyGroup 元素中手动添加这样的<TargetFrameworkVersions>net452;net462;net471</TargetFrameworkVersions> 行。然后通过为各种目标 .NET 版本添加部分来修改(而不是删除)文件 project.assets.json。这是一项乏味的工作,我可以想象这对于具有多个版本的多个项目来说会很痛苦。我在项目的某处保存了该文件的副本并将其添加到存储库中,这样如果它被 VS 重新生成,我可以轻松地恢复它。

如果您只能坚持一个版本(最小公分母) - 您不需要任何一个版本。 Here is my project.assets.json file 用于在 NuGet 上为 .NET 4.5.2、4.6.2 和 4.7.1 发布的非常简单的结构和最少数量的依赖项项目。让我们希望 VS 团队将来能找到更好的方法来完成这一切。

【讨论】:

  • 如果有人能提出更好的解决方案,我将不胜感激。
猜你喜欢
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
相关资源
最近更新 更多