我希望通过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。
答案 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>
我对此进行了如下验证:
OLD_...
配置)的mscorlib程序集的2.0.0.0版本,以及4.0框架(NEW_...
配置)的mscorlib版本4.0.0.0。使用ILSpy,我发现我的程序集的3.5版本没有目标框架的属性,因为这只是从版本4开始引入,但版本4框架显示为组件:
[assembly: TargetFramework(".NETFramework,Version=v4.0", FrameworkDisplayName = ".NET Framework 4")]