如何在同一项目的不同配置中定位不同的框架版本?

时间:2012-02-03 23:46:04

标签: .net visual-studio-2010 target-framework

我有一个面向.NET 3.5的类库。现在,我想添加一些需要.NET 4.0的功能,但我仍然希望能够生成一个面向.NET 3.5的版本(当然没有这些功能)。

理想情况下,我希望根据配置定位不同的框架版本:

  • Debug,Release => .NET 3.5
  • Debug 4.0,Release 4.0 => .NET 4.0

不幸的是,这似乎不可能,因为目标框架对整个项目来说是全球性的......

周围有办法吗?我知道我可以创建一个包含相同文件的第二个项目,但这对于可维护性来说非常糟糕....

最简单的方法是什么?如果你做过类似的事情,哪种方法效果最好?

2 个答案:

答案 0 :(得分:4)

首先,您可以从创建条件编译符号开始,该符号使您能够包含或排除仅适用于.NET4.0框架的额外功能。

接下来,我认为您必须直接使用MSBuild,而不是让VS.NET构建您的项目。 我曾做过类似的事情。简而言之,它归结为您必须在MSbuild脚本中创建2个构建任务。允许您为.NET 3.5构建项目,以及允许您构建面向.NET 4.0的项目的项目。

在每个构建任务中,您可以定义目标框架以及您想要使用的条件编译符号。

build-script中的build-tasks可能是这样的:

<Target Name="buildall-v4">
    <!-- The following ItemGroup defines all the build-constants that have to be used
         in the build.  
         As can be seen, the DEBUG & RELEASE constants are only included when necessary -->

    <ItemGroup>
      <BuildConstant Include="DEBUG" Condition="'$(buildmode)'=='DEBUG'" />
      <BuildConstant Include="RELEASE" Condition="'$(buildmode)'=='RELEASE'" />
      <BuildConstant Include="NET_FRAMEWORK_4_0" />
    </ItemGroup>

    <PropertyGroup>
      <BuildConstantsToUse>@(BuildConstant)</BuildConstantsToUse>
    </PropertyGroup>

    <MSBuild Projects="$(builddir)\Source\MyProject.sln"
             Properties="OutputPath=$(outputdir)\v4;Configuration=$(buildmode);DefineConstants=$(BuildConstantsToUse);TargetFrameworkVersion=v4.0" />       
  </Target>


<Target Name="buildall-v3.5">
        <!-- The following ItemGroup defines all the build-constants that have to be used
             in the build.  
             As can be seen, the DEBUG & RELEASE constants are only included when necessary -->

        <ItemGroup>
          <BuildConstant Include="DEBUG" Condition="'$(buildmode)'=='DEBUG'" />
          <BuildConstant Include="RELEASE" Condition="'$(buildmode)'=='RELEASE'" />
        </ItemGroup>

        <PropertyGroup>
          <BuildConstantsToUse>@(BuildConstant)</BuildConstantsToUse>
        </PropertyGroup>

        <MSBuild Projects="$(builddir)\Source\MyProject.sln"
                 Properties="OutputPath=$(outputdir)\v3.5\;Configuration=$(buildmode);DefineConstants=$(BuildConstantsToUse);TargetFrameworkVersion=v3.5" />        
      </Target>

当然,当您想为2个版本构建时,您必须在命令行上分别执行每个msbuild命令。

答案 1 :(得分:3)

我学会了如何使用:
http://blogs.msdn.com/b/visualstudio/archive/2010/05/14/a-guide-to-vcxproj-and-props-file-structure.aspx

http://shazwazza.com/post/multi-targeting-a-single-net-project-to-build-for-different-framework-versions/

基本上,请按照以下步骤操作:

  1. 使用文本编辑器打开项目文件,以便查看/编辑所有XML。您的项目文件是 ProjectName .vcxproj
    • 使用Visual Studio文本编辑器
      1. 卸载您计划编辑的项目。右键单击要编辑的项目,然后选择“卸载项目”;它会变成灰色。
      2. 使用文件 - &gt;打开 - &gt;文件... Ctrl + O并导航到 ProjectName .vcxproj文件的位置并将其打开。请勿使用文件 - >打开 - &gt;项目/解决方案。
      3. 完成后,您需要保存/关闭文件,右键单击解决方案资源管理器中的项目,然后选择“重新加载项目”
    • 或者只使用其他编辑器,例如Notepad ++,甚至是Visual Studio的新实例。
  2. 下一步:

    • 删除

      <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
      
    • 来自

      <PropertyGroup Label="Globals">
      
    • </PropertyGroup> 
      
    • 标签

  3. 现在:

    • 粘贴

      <TargetFrameworkVersion>v4.0</TargetFrameworkVersion> 
      
    • <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
      
    • 在相应的“Debug”

      <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
      
    • 或“Debug 4.0”

      <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 4.0|Win32'" Label="Configuration">
      
      • 由于它不再位于“Globals”属性组中,因此请确保每个配置的PropertyGroup中都包含<TargetFrameworkVersion Blah="blah blah">标记。
  4. 保存更改(如果使用相同的visual studio实例,可能需要关闭文件)。

  5. 在visual studio中加载或重新加载项目,并验证各个配置是否使用不同的框架构建。