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

时间:2018-06-20 09:26:36

标签: c# .net visual-studio target .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>

在我当前的代码中,例如: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及更高版本使用什么条件?

1 个答案:

答案 0 :(得分:0)

好像我在这个很好的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