繁体   English   中英

使用不同的项目配置来定位多个.net框架版本

[英]Targetting multiple .net framework versions by using different project configurations

我有一个项目,我需要建立两种不同的配置。 一个配置将针对.net框架3.5,另一个配置将针对.net框架4.0。 首先是可能的吗? 我创建了一个名为DotNet35的新配置(使用通常的步骤),它将以.net 3.5为目标。 我已经通过将创建的项目配置中的目标版本指定为v3.5来完成此操作。它似乎不起作用。 知道为什么吗? 这是我的.csproj中的属性组部分(只有手动添加是TargetFrameworkVersion元素)

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DotNet35|AnyCPU'">
    <DebugSymbols>true</DebugSymbols>
    <OutputPath>bin\DotNet35\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <DebugType>full</DebugType>
    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
    <PlatformTarget>AnyCPU</PlatformTarget>
    <CodeAnalysisLogFile>..\..\bin\Client\Debug\CS.XRAY.XRayClient.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
    <ErrorReport>prompt</ErrorReport>
    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
    <CodeAnalysisRuleSetDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
    <CodeAnalysisRuleDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
  </PropertyGroup>

你所做的应该有效,尽管Visual Studio会在你的项目设置中显示错误的“目标框架”。

根据我的经验,可以通过手动修改项目文件(.csproj)在单个项目中定位多个.NET框架版本。

假设您已经拥有.NET 4配置,并且想要创建.NET 3.5配置。 做这个:

  1. 在Visual Studio中,根据现有的“调试”和“发布”配置,创建两个新的解决方案配置(在Configuration Manager中),其名称如“Debug.Net35”和“Release.Net35”。 告诉VS“创建新项目配置”。 然后保存您的项目并退出Visual Studio。

  2. 在文本编辑器(而不是VS)中编辑每个项目文件。 查找引用新.Net35配置的所有PropertyGroup元素,例如:

     <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release.Net35|AnyCPU'"> 

    在该行下面添加一个TargetFrameworkVersion元素:

     <TargetFrameworkVersion>v3.5</TargetFrameworkVersion> 

    请记住 :您通常需要更改2-4个PropertyGroup。 为了更好地衡量,您可能还想为原始配置添加<TargetFrameworkVersion> ,但这是可选的,因为原始<TargetFrameworkVersion>将从非限定<ProjectGroup>元素继承。

  3. 您可能需要添加一个.NET框架版本中存在的引用,而不是另一个。 例如,您可能使用System.Core.dll,但仅限于.NET 3.5及更高版本,以及WindowsBase.dll,但.NET 2.0除外。 您可以通过在项目文件中创建特殊引用来完成此操作:

     <ItemGroup Condition="'$(TargetFrameworkVersion)'!='v2.0'"> <Reference Include="WindowsBase" /> </ItemGroup> <ItemGroup Condition="'$(TargetFrameworkVersion)'!='v2.0' And '$(TargetFrameworkVersion)'!='v3.0'"> <Reference Include="System.Core" /> </ItemGroup> 

    或者您可以使用Theraot的.NET兼容性DLL ,但仅限于.NET 3.5及更早版本,例如:

     <ItemGroup Condition="'$(TargetFrameworkVersion)'=='v3.5' Or '$(TargetFrameworkVersion)'=='v3.0' Or '$(TargetFrameworkVersion)'=='v2.0'"> <Reference Include="Theraot.Core"> <HintPath>..\\Lib\\Theraot.Core.dll</HintPath> </Reference> </ItemGroup> 

    我相信ItemGroup元素应该是Project的子元素,而不是现有ItemGroup的子元素。

Visual Studio会表现得有些奇怪。 更改配置时,项目设置中显示的“目标框架”将始终保持不变。 例如,当您使用“添加引用”时,列出的引用将基于默认的 .NET框架版本,而不是当前配置指定的当前版本。

我不认为你可以通过同一个项目的多个配置来做到这一点。

但是,您可以通过拥有多个项目文件来实现这一目标,每个项目都针对不同的框架版本。

编辑:最简单的方法,顺便说一下,只需复制您当前的项目文件,打开它,并更改目标框架版本。

您可能不需要这样做......理论上,它只需要一个简单的配置文件来使.NET 3.5应用程序针对.NET 4运行。 这可能比使用两个单独的构建更容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM