C# 在Visual Studio中更改生成配置时更改应用程序目标框架
我有以下构建配置: 这些平台配置: 这些编译器条件:C# 在Visual Studio中更改生成配置时更改应用程序目标框架,c#,.net,vb.net,visual-studio,msbuild,C#,.net,Vb.net,Visual Studio,Msbuild,我有以下构建配置: 这些平台配置: 这些编译器条件: NET40 NET45 我的解决方案是一个巨大的API,由20个解决方案组成,其中一些解决方案使用Async关键字和其他只能从.NetFx 4.5获得的好处 代码的这一部分以条件的形式存在,如下所示: #If NET45 then Sub Async ... End Sub #Else Sub ... End Sub #End If 然后,我要做的是明确的,.NetFx 4.5构
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#project设置和它们的编译器参数之间有一些很大的差异,所以C#advanced答案可能对我没有帮助。我的建议是通过移动部分文件中的platform/target/etc sencitive代码来消除代码中的条件语句。然后,我将转到项目文件,并使用ms build提供的所有功能,使IClude文件在特定条件下敏感 例如:
- 在Visual Studio中创建全新的VB控制台应用程序
- 添加三个类文件ClassDotNetFeatures40.vb、ClassDotNetFeatures45.vb和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 Condition="'$(Configuration)' == 'Debug'" Include="ClassDotNetFeatures40.vb" />
<Compile Condition="'$(Configuration)' == 'Release'" Include="ClassDotNetFeatures45.vb" />
- 按保存
- 右键单击项目文件并按重新加载
您需要手动更改项目文件(我使用了
csproj
——希望vbproj
也能以同样的方式工作)
本节中描述的所有项目配置属性如下:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
...
</PropertyGroup>
请注意,VS.Net GUI不支持此功能,并且不会在“项目属性”窗口中显示正确的值;尽管它将使用这些值进行构建
根据您的解决方案的复杂性,您可能会发现一些其他工件,因为VS.Net不会正确地重新加载项目,但至少可以从控制台进行构建
此外,您可能需要使用类似的条件“hack”来引用正确的库。我认为C#标记不合适。谢谢你的回答,我很感谢你的帮助和时间分析,但我不能认为它是一个解决方案,因为它会产生更多的问题,而这些额外的问题将是比我现在的问题更大或更危险的问题。此外,还需要以同样的方式解决这些问题,在项目文件中使用更棘手的手动黑客。我对它进行了测试,正如您所提到的,VS似乎不支持这种攻击,因为一旦应用了这些修改,我就无法更改UI中的目标框架。我不知道是否存在一个简单的解决方案。@ElektroStudios我认为您不会找到简单的解决方案:您希望在编译期间为条件框架版本选择提供GUI支持,但VS明确表示,当您更改project的目标框架版本时,它需要重新加载project;所以,如果解决方案存在,它应该使用已经“正确”的目标框架打开解决方案。作为一个类似的选项,您可以使用两组不同的solution+csproj文件(而不是配置),一组用于4.0,另一组用于4.5,它们将使用相同的源文件-但这将导致非常高的支持成本我完全不理解,您能举个例子说明您的意思吗?。谢谢你的回答。这是一篇关于vb.net中部分类的文章。itemgroup节点的条件
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
...
</PropertyGroup>
<?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>