6

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

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

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

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

有办法解决吗?我知道我可以创建第二个包含相同文件的项目,但这对可维护性很不利......

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

4

2 回答 2

4

首先,您可以从创建一个条件编译符号开始,该符号使您能够包含或排除仅适用于 .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 命令。

于 2012-02-03T23:52:53.103 回答
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. 使用 File->Open->File... Ctrl+O 并导航到ProjectName .vcxproj 文件的位置并打开它。不要使用文件->打开->项目/解决方案。
      3. 完成后,您需要保存/关闭文件并在解决方案资源管理器中右键单击项目并选择“重新加载项目”
    • 或者只是使用不同的编辑器,例如 Notepad++,甚至是 Visual Studio 的新实例。
  2. 下一个:

    • 消除

      <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
      
    • 从内部

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

  3. 现在:

    • 粘贴

      <TargetFrameworkVersion>v4.0</TargetFrameworkVersion> 
      
    • 或者

      <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
      
    • 在适当的“调试”内

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

      <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 4.0|Win32'" Label="Configuration">
      
      • 由于它不再位于“全局”属性组中,因此请确保每个配置<TargetFrameworkVersion Blah="blah blah">在其 PropertyGroup 中都有标签。
  4. 保存更改(如果使用将加载项目的同一 Visual Studio 实例,可能还需要关闭文件)。

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

于 2014-08-06T16:13:25.693 回答