.NET:通过项目配置实现不同的目标框架

时间:2018-02-12 11:23:09

标签: c# .net visual-studio configuration

我希望通过Visual Studio 2015中的配置有两个不同的.net框架目标。对于引用,您可以编辑CSPROJ文件并添加条件,这似乎不适用于TargetFrameworkVersion in文件的第一个PropertyGroup。我的印象是该元素中的任何Condition都会导致VS完全忽略此元素并回退到默认值“v4.0”。

有什么方法可以为不同的配置获得不同的目标框架版本吗?

这是我在CSPROJ文件中尝试过的:

<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    ...
    <!-- this is what VS2015 would put into the file:
    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
    -->
    <!-- this is what does not work: -->
    <TargetFrameworkVersion Condition="'$(Configuration)' == 'OLD_Debug' OR '$(Configuration)' == 'OLD_Release'">v3.5</TargetFrameworkVersion>
    <TargetFrameworkVersion Condition="'$(Configuration)' == 'NEW_Debug' OR '$(Configuration)' == 'NEW_Release'">v4.0</TargetFrameworkVersion>
    ...
  </PropertyGroup>
  ...
</Project>

具有装配参考条件的类似方法可以正常工作。

修改 我发现了一个类似的Stackoverflow问题: Targetting multiple .net framework versions by using different project configurations并尝试了未接受的答案中建议的方法,从第一个TargetFrameworkVersion块中移除PropertyGroup,并编辑后来的<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'OLD_Debug|AnyCPU' ">块以包含它,但是我的无论我使用哪种配置,仍然为框架3.5编译程序集。至少如果我使用[System.Reflection.Assembly]::LoadFrom("C:\PATH\MyAssembly.dll").ImageRuntimeVersion查看Powershell的程序集,我总是得到版本2,而不是4。

1 个答案:

答案 0 :(得分:1)

this answer中针对类似问题的方法有效: 保留第一个PropertyGroup没有配置特定设置,从中删除TargetFrameworkVersion元素。并将TargetFrameworkVersion设置添加到文件中的配置特定PropertyGroup,只需将它们加倍以进行调试/发布:

<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    ...
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'OLD_Debug|AnyCPU' ">
    ...
    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'OLD_Release|AnyCPU' ">
    ...
    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'NEW_Debug|AnyCPU' ">
    ...
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'NEW_Release|AnyCPU' ">
    ...
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
  </PropertyGroup>
  ...
</Project>

我对此进行了如下验证:

  1. 我的程序集引用了3.5框架(OLD_...配置)的mscorlib程序集的2.0.0.0版本,以及4.0框架(NEW_...配置)的mscorlib版本4.0.0.0。
  2. 使用ILSpy,我发现我的程序集的3.5版本没有目标框架的属性,因为这只是从版本4开始引入,但版本4框架显示为组件:

    [assembly: TargetFramework(".NETFramework,Version=v4.0", FrameworkDisplayName = ".NET Framework 4")]