在 SDK 项目中同时针对 .NET Framework 4.8 和 .NET 8.0?

问题描述 投票:0回答:2

我有一个应用程序是另一家公司开发的另一个较大应用程序的插件(即我无法控制父应用程序)。 父应用程序正在更新到 .NET 8.0 以发布下一个版本,但目前使用的是 .NET Framework 4.8。 我需要支持这个新版本,但会继续支持旧版本几年。 传统上,我们通过 csproj 文件中的条件引用来完成此操作。 我们现在正在“升级”到新的 SDK 项目格式。 我正在努力让它发挥作用,但我在跨越不同的目标时遇到了困难。

我通过创建一个新的解决方案设置了一个基本的测试示例,该解决方案中只有 2 个默认项目,并进行了多目标的基本修改。 以下是引用库的 .csproj 文件内容:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>net48;net8.0-windows</TargetFrameworks>
    <Configurations>Release2024;Release2025</Configurations>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)' == 'Release2025'">
    <TargetFramework>net8.0-windows</TargetFramework>
    <OutputPath>..\Build 2025\</OutputPath>
    <DefineConstants>TRACE;r2025</DefineConstants>
    <Optimize>true</Optimize>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)' == 'Release2024'">
    <TargetFramework>net48</TargetFramework>
    <OutputPath>..\Build 2024\</OutputPath>
    <DefineConstants>TRACE;r2024</DefineConstants>
    <Optimize>true</Optimize>
  </PropertyGroup>
</Project>

这是引用该项目的“顶级”项目:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>net48;net8.0-windows</TargetFrameworks>
    <Configurations>Release2024;Release2025</Configurations>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)' == 'Release2025'">
    <TargetFramework>net8.0-windows</TargetFramework>
    <OutputPath>..\Build 2025\</OutputPath>
    <DefineConstants>TRACE;r2025</DefineConstants>
    <Optimize>true</Optimize>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)' == 'Release2024'">
    <TargetFramework>net48</TargetFramework>
    <OutputPath>..\Build 2024\</OutputPath>
    <DefineConstants>TRACE;r2024</DefineConstants>
    <Optimize>true</Optimize>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="..\TestReferenced\TestReferenced.csproj" />
  </ItemGroup>
</Project>

然后我就有了同名的解决方案配置。 这个想法是,当我构建“Release2024”时,所有内容都以 4.8 为目标,而当我构建“Release2025”时,所有内容都以 8.0 为目标。 然而,当我尝试构建 Release2025 时,它告诉我:

'..\TestReferenced\TestReferenced.csproj' 目标为 'net8.0-windows'。它 无法被目标项目引用 '.NETFramework,版本=v4.8'。测试库 C:\Program Files\Microsoft 视觉的 Studio�2\Community\MSBuild\Current\Bin md64\Microsoft.Common.CurrentVersion.targets 1860

我知道

TestReferenced
可以选择引用 4.8,但对于该配置,它应该针对 8.0...

有什么办法让它以这种方式定位并正确构建吗?

编辑 我还应该提到,我的项目中有需要使用的 WPF 组件。

csproj .net-sdk
2个回答
1
投票

对于其他人来说,我最终确实做到了这一点。 我只是将初始

TargeFramework
设置为 8.0 并根据条件重置它,如下所示(删除了额外的属性以突出显示差异):

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0-windows</TargetFramework>
    <Configurations>Release2024;Release2025</Configurations>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)' == 'Release2025'">
    <TargetFramework>net8.0-windows</TargetFramework>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)' == 'Release2024'">
    <TargetFramework>net48</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="..\TestReferenced\TestReferenced.csproj" />
  </ItemGroup>
</Project>

这似乎让它只能看到构建配置的相关框架,并使用该框架,并且所有框架似乎都按预期工作。


0
投票

您不会碰巧升级 Revit,对吗?如果是这样,我也在做同样的事情👍。

对我来说,最终解决方案的问题在于它在 VS 中构建得很好(当 VS UI 刷新 platform-combobox-change 事件上的 obj 资源时),但是使用 dotnet CLI,它初始化不正确,并且无法找到正确的 TargetFramework早期版本基于 net481。

尝试过dotnet刷新,但似乎不起作用...仍在寻找好的解决方案。🤷u200d♂️

© www.soinside.com 2019 - 2024. All rights reserved.