【问题标题】:Targetting multiple .net framework versions by using different project configurations通过使用不同的项目配置来定位多个 .net 框架版本
【发布时间】:2011-06-27 17:50:33
【问题描述】:

我有一个项目,我需要以两种不同的配置进行构建。一种配置以 .net framework 3.5 为目标,另一种以 .net framework 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>

【问题讨论】:

    标签: .net


    【解决方案1】:

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

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

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

    1. 在 Visual Studio 中,基于现有的“调试”和“发布”配置,创建两个新的解决方案配置(在配置管理器中),名称为“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。为了更好地衡量,您可能还想为原始配置添加&lt;TargetFrameworkVersion&gt;,但这是可选的,因为原始&lt;TargetFrameworkVersion&gt; 将从不合格的&lt;ProjectGroup&gt; 元素继承。

    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's .NET compatibility 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 框架版本,而不是当前配置指定的当前版本。

    【讨论】:

      【解决方案2】:

      我认为同一项目的多个配置无法做到这一点。

      不过,您可以通过拥有多个项目文件来做到这一点,每个项目文件都针对不同的框架版本。

      编辑: 最简单的方法是复制您当前的项目文件,打开它,然后更改目标框架版本。

      【讨论】:

      • 并添加原始代码文件作为参考。并且在 1 个解决方案下有 2 个项目。
      【解决方案3】:

      您可能不需要这样做...理论上只需要simple config file 就可以使 .NET 3.5 应用程序针对 .NET 4 运行。这可能比使用两个单独的构建更简单。

      【讨论】:

      • 这应该是一条评论。
      猜你喜欢
      • 2018-07-22
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多