[英]Change the application target framework when changing build configurations in Visual Studio
我有这些构建配置:
这些平台配置:
而这些编译条件:
NET40
NET45
我的解决方案是一个庞大的API,包含20个解决方案,其中一些解决方案使用Async
关键字和其他只能从.NetFx 4.5获得的优势。
这部分代码我以这种方式在条件中:
#If NET45 then
Sub Async
...
End Sub
#Else
Sub
...
End Sub
#End If
然后,我想要做的是清楚,.NetFx 4.5构建配置应该编译NET45条件的块,而.NetFx 4.0构建配置应该编译#Else部分的块。
我发现的问题是,如果我在项目设置中更改应用程序目标框架,则更改将在所有其他构建配置中保留,并且我希望避免持久性。
那我该怎么做呢?
注意:
我用C#标记标记了这个问题,因为它是一个一般的Visual Studio环境问题,但我会澄清我的解决方案是用Vb.Net编写的,因为我知道C#项目设置和它们的编译器参数之间有一些很大的区别所以也许C#高级答案无法帮助我。
我的建议是通过在部分文件中移动platform / target / etc sencitive代码来摆脱代码中的条件语句。 然后我会转到项目文件,并使用所有功能ms-build提供的特定条件使包含的文件敏感
例:
在GenericClass.vb中
Partial Public Class GenericClass
Public Sub Hello()
Console.Write("Hello ")
End Sub
End Class
在ClassDotNetFeatures40.vb中
Partial Public Class GenericClass
Public Sub Word()
Console.Write("4.0 Word!")
End Sub
End Class
在
ClassDotNetFeatures45.vb
Public Class GenericClass
Public Sub Word()
Console.Write("4.5 Word!")
End Sub
End Class
将以下代码放在Module1.vb中
Sub Main() Dim o = New GenericClass() o.Hello() o.Word() End Sub
保存全部
<Compile Include="ClassDotNetFeatures40.vb" /> <Compile Include="ClassDotNetFeatures45.vb" />
并用它们替换它们
<Compile Condition="'$(Configuration)' == 'Debug'" Include="ClassDotNetFeatures40.vb" />
<Compile Condition="'$(Configuration)' == 'Release'" Include="ClassDotNetFeatures45.vb" />
现在,当您运行项目撤消调试时,您将获得:
你好4.0 Word!
撤消发布你会得到:
你好4.5字!
您需要手动更改项目文件(我已经使用csproj
- 希望vbproj
以相同的方式工作)。
所有项目配置属性在以下部分中描述:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
...
</PropertyGroup>
请注意Condition
语句 - 它描述了为Debug, AnyCPU
配置指定的此特定属性集。
您需要做的是将TargetFrameworkVersion
属性从一般顶级移动到特定于配置的级别,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<!-- general properties here - removing framework related... -->
<!--<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>-->
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<!-- Use 4.0 for Debug -->
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<!-- other properties here... -->
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<!-- Use 4.5 for Release -->
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<!-- other properties here... -->
</PropertyGroup>
请注意,VS.Net GUI不支持此功能,并且不会在项目“属性”窗口中显示正确的值; 虽然它会使用这些值进行构建。
根据您的解决方案的复杂性,您可能会发现一些其他工件,因为VS.Net不会正确地重新加载项目,但至少这应该适用于从控制台构建。
此外,您可能需要使用类似的条件“黑客”来引用正确的库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.