运维开发网

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

运维开发网 https://www.qedev.com 2020-06-09 20:45 出处:网络 作者:运维开发网整理
我有一个针对.NET 3.5的类库.现在,我想添加一些需要.NET 4.0的功能,但我仍然希望能够生成一个针对.NET 3.5的版本(当然没有这些功能). 理想情况下,我想根据配置定位不同的框架版本: > Debug,Release => .NET 3.5 > Debug 4.0,Release 4.0 => .NET 4.0 不幸的是,它似乎不可能,因为目标框架对整个项目来说是全球性的…… 有办
我有一个针对.NET 3.5的类库.现在,我想添加一些需要.NET 4.0的功能,但我仍然希望能够生成一个针对.NET 3.5的版本(当然没有这些功能).

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

> Debug,Release => .NET 3.5

> Debug 4.0,Release 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命令.

0

精彩评论

暂无评论...
验证码 换一张
取 消