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

Ank*_*ass 3 .net

我有一个项目,我需要建立两种不同的配置.一个配置将针对.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>
Run Code Online (Sandbox Code Playgroud)

Qwe*_*tie 6

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

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

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

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

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

    <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release.Net35|AnyCPU'">
    
    Run Code Online (Sandbox Code Playgroud)

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

    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
    
    Run Code Online (Sandbox Code Playgroud)

    请记住:您通常需要更改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>
    
    Run Code Online (Sandbox Code Playgroud)

    或者您可以使用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>
    
    Run Code Online (Sandbox Code Playgroud)

    我相信这个ItemGroup元素应该是一个孩子Project,而不是一个现存的孩子ItemGroup.

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