有条件地编译.NET的最低版本

时间:2017-05-26 19:20:15

标签: .net .net-core .net-standard

.NET Standard的承诺是,为一个版本编写的任何内容都适用于未来的版本。

现在我可以有条件地编译一些东西,例如。

#if NETSTANDARD1_3
// do things
#elif NETSTANDARD1_4 || NETSTANDARD2_0 || NET45
// do other things
#endif

但对我而言,这似乎很难扩展,因为如果我决定在未来添加新目标,例如对于.NET Standard 2.1,我必须在我有这些条件的地方更新它。

我想做的是:

#if NETSTANDARD1_3
// do things
#elif NETSTANDARD1_4_OR_GREATER || NET45_OR_GREATER
// do other things
#endif

我目前的解决方案是在我的项目文件中手动创建这些_OR_GREATER定义。这至少可以将我的维护保留为单个文件而不是每个源文件:

<PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
    <DefineConstants>NETSTANDARD1_4_OR_GREATER;$(DefineConstants)</DefineConstants>
</PropertyGroup>

但是,我很好奇这是否已经以其他更标准的方式解释了。这是一件事吗?

1 个答案:

答案 0 :(得分:4)

使用一些msbuild技巧可以实现这一点。 SDK目标(通过SDK="…"上的<Project/>属性隐式导入项目后)将TargetFramework属性拆分为TargetFrameworkIdentifier和{{1} }。

所以TargetFrameworkVersion会导致:

  • <TargetFramework>netstandard1.5</…>$(TargetFrameworkIdentifier)
  • .NETStandard$(TargetFrameworkVersion)
  • v1.5$(_TargetFrameworkVersionWithoutV),但此属性为&#34;私有&#34;按照惯例(下划线),不应使用,因为它可能会更改/不保证可以被自定义目标使用。

比较字符串时,MSBuild会在比较之前尝试将它们解析为版本,因此我们可以比较1.5。 使用它,我们可以在编译过程之前挂钩目标,以根据版本范围设置自定义变量:

'1.5' >= '1.4'