Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Visual Studio中更改生成配置时更改应用程序目标框架_C#_.net_Vb.net_Visual Studio_Msbuild - Fatal编程技术网

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
  • 添加以下代码
在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" />

  • 按保存
  • 右键单击项目文件并按重新加载
现在,当您运行“项目撤消调试”时,您将获得:

你好4.0字

撤消释放您将获得:

你好4.5字


您需要手动更改项目文件(我使用了
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>