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

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

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

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

  • 调试、发布 => .NET 3.5
  • 调试 4.0,4.0 版 => .NET 4.0

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

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

    什么是最简单的方法来做到这一点?如果您曾经做过类似的事情,哪种方法效果最好?

    最佳答案

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

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

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

    构建脚本中的构建任务可能是这样的:

    <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 命令。

    关于.net - 如何在同一项目的不同配置中定位不同的框架版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9136995/

    相关文章:

    c++ hash 在具有相同输入的 VS 2010 和 VS 2013 上返回不同的结果

    visual-studio-2019 - 如何在 Visual Studio 2019 中使用 .NET 版本 4.6.2 运行单元测试?

    .net - 我可以使用 Visual Studio 2010 而不升级到 .NET Framework 4.0 吗?

    c# - 任务并行库异常处理

    c# - Nullable.GetUnderlyingType 无法正常工作

    c# - ViewModelBuilder 泛型类型转换问题

    c++ - 升级到VS2010 : Random Unresolved Symbol

    visual-studio-2010 - 在 VS2010 中使用断言创建编码的 UI 测试的工作流程是什么?

    c# - 如果我调用 C# 事件处理程序并调用它,会发生什么情况?

    reference - 为什么带有引用程序集的 VS2012 项目不能自动定位到 4.0