【问题标题】:How to use conditional symbols when targeting multiple frameworks correctly (VS2017)正确定位多个框架时如何使用条件符号(VS2017)
【发布时间】:2018-06-20 09:26:35
【问题描述】:

我想将针对 .NET Framework 4.6.1 的库项目迁移到同时针对 .NET Framework 4.6.1 和 .NET Standard 2.0 的新库项目。

<PropertyGroup Condition=" '$(OS)' == 'Windows_NT' "> 
    <TargetFrameworks>netstandard2.0;net461</TargetFrameworks>
</PropertyGroup>

在我当前使用的代码中,例如:System.Web.Hosting.HostingEnvironment.MapPath() 方法;所以,我已经在我的.csproj 文件中添加了一个条件:

<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
    <Reference Include="System.Web" />
</ItemGroup>

现在在我的代码中,我知道我可以有这样的东西:

#if NET461
   if (someFolderVar.StartsWith("~/"))
       someFolderVar = System.Web.Hosting.HostingEnvironment.MapPath(someFolderVar);
#endif

我的问题:

如果以后我将项目更改为面向 .NET Framework 4.7,是否会执行上述代码,或者它将严格针对 .NET Framework 4.6.1? 4.6.1 及更高版本使用什么条件?

【问题讨论】:

标签: c# .net visual-studio target .net-standard


【解决方案1】:

看起来我在这个非常好的article 中找到了解决方案。使用NETFULL 条件符号(来自文章,但任何名称都可以)应该是一个解决方案:

<PropertyGroup Condition=" '$(TargetFramework)' == 'net461'">
  <DefineConstants>NETFULL</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(TargetFramework)' == 'net47'">
  <DefineConstants>NETFULL</DefineConstants>
</PropertyGroup>

然后是代码:

#if NETFULL
if (someFolderVar.StartsWith("~/"))
   someFolderVar = System.Web.Hosting.HostingEnvironment.MapPath(someFolderVar);
#endif

【讨论】:

  • 一个明显的问题是您仍然需要在项目文件中明确提及所有 .NET Framework 版本。这比在您的代码中提及它们要好,但在兼容性方面仍然存在问题。以此为目标 .NET 4.7.2 将改变行为,而代码中没有任何指示。我很难想象 MS 中没有人遇到过这样的问题,这让我认为这是设计使然,尽管我无法理解这种设计是什么。当使用未知框架时,您最好停止构建并显示“请更新条件”错误!
  • @JeroenMostert 你提出了很好的观点。谢谢,我很感激!
  • 只是一个旁注:你可以给NETFULL-symbol 任何你喜欢的名字,也可以只是MYCONST。该常量仅存在于您的程序集中,如您的 csproj 文件中的 DefineConstants-tag 所示。
  • 顺便说一句。我使用多目标(SDK/PackageReference)项目模板(4.0、4.5 和标准 2.0)制作了开源 VS2017 扩展,主要基于 Learner 提到的文章 + 一些调整,例如在构建 .nupkg 到本地路径的副本之后(目的:更新本地 NuGet 库)。此外,还有教程(在扩展描述中链接)进一步讨论了您询问的问题。扩展名:marketplace.visualstudio.com/…,教程:blog.veles.rs/imbace-basicpack-getting-started-draft
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
相关资源
最近更新 更多