我有一个面向.NET 3.5的类库。现在,我想添加一些需要.NET 4.0的功能,但我仍然希望能够生成一个面向.NET 3.5的版本(当然没有这些功能)。
理想情况下,我希望根据配置定位不同的框架版本:
不幸的是,这似乎不可能,因为目标框架对整个项目来说是全球性的......
周围有办法吗?我知道我可以创建一个包含相同文件的第二个项目,但这对于可维护性来说非常糟糕....
最简单的方法是什么?如果你做过类似的事情,哪种方法效果最好?
答案 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/
基本上,请按照以下步骤操作:
下一步:
删除
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
来自
<PropertyGroup Label="Globals">
和
</PropertyGroup>
标签
现在:
粘贴
<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">
<TargetFrameworkVersion Blah="blah blah">
标记。保存更改(如果使用相同的visual studio实例,可能需要关闭文件)。
在visual studio中加载或重新加载项目,并验证各个配置是否使用不同的框架构建。