正确定位多个框架时如何使用条件符号(VS2017)

Lea*_*ner 6 .net c# target visual-studio .net-standard

我想将一个针对.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>
Run Code Online (Sandbox Code Playgroud)

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

<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
    <Reference Include="System.Web" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

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

#if NET461
   if (someFolderVar.StartsWith("~/"))
       someFolderVar = System.Web.Hosting.HostingEnvironment.MapPath(someFolderVar);
#endif
Run Code Online (Sandbox Code Playgroud)

我的问题:

如果稍后我将我的项目更改为目标.NET Framework 4.7,是否将执行上述代码或仅严格针对.NET Framework 4.6.1?4.6.1及以上的使用条件是什么?

Lea*_*ner 1

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

<PropertyGroup Condition=" '$(TargetFramework)' == 'net461'">
  <DefineConstants>NETFULL</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(TargetFramework)' == 'net47'">
  <DefineConstants>NETFULL</DefineConstants>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

然后是代码:

#if NETFULL
if (someFolderVar.StartsWith("~/"))
   someFolderVar = System.Web.Hosting.HostingEnvironment.MapPath(someFolderVar);
#endif
Run Code Online (Sandbox Code Playgroud)

  • 一个明显的问题是您仍然需要在项目文件中显式提及所有 .NET Framework 版本。这比在代码中提及它们要好,但仍然存在兼容性问题。以此为目标 .NET 4.7.2 将更改行为,而代码中没有任何指示。我很难想象微软没有人遇到过这样的问题,这让我认为这是设计使然,尽管我不知道这个设计是什么。当使用未知框架时,您最好停止构建并显示错误“请更新条件”! (2认同)