多个目标框架项目:不同框架上同一 NuGet 包的不同版本?

Jea*_*anz 6 c# visual-studio target-framework nuget-package

我使用 EntityFramework 5.0.13 组合了一个 .Net 5 for Windows 应用程序。

现在我们尝试在尚未安装 .Net 5 框架的特定服务器上运行它。管理服务器的好人告诉我,他们尝试安装新东西,但似乎无法使应用程序运行。可能需要重新启动服务器,但暂时无法完成。

所以我需要为我的应用程序使用较旧的目标框架。很好,所以我决定针对多个框架,同时添加 .Net Framework 4.8。在我的 .csproj 文件中,这相当于替换

    <TargetFramework>net5.0-windows</TargetFramework>
Run Code Online (Sandbox Code Playgroud)

    <TargetFrameworks>net5.0-windows;net48</TargetFrameworks>
Run Code Online (Sandbox Code Playgroud)

这应该可以解决问题。

不幸的是,EntityFramework 5.0.13 与 .Net Framework 4.8 不兼容。

所以我使用了旧版本 3.1.9(在我们的另一个项目上运行良好)。

需要一点说服力,但现在我的项目使用 3.1.9。(我相信,一旦我降级一些语句,它就会建立得很好Class variable = new();if (variable is not null)

现在,我想知道的是,我可以让我的 .Net 5 目标框架再次使用 EntityFramework 5.0.13 而不是 3.1.9 吗?

现在,我的 .csproj 文件读取

    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.9" />
Run Code Online (Sandbox Code Playgroud)

在我开始使用多个目标框架之前,这是

    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.13" />
Run Code Online (Sandbox Code Playgroud)

有没有办法添加属性PackageReference(或将其替换为另一个节点),以便它仅针对特定框架?

And*_*ent 7

一种简单的方法是有条件地添加 <PackageReference ...> 节点:

<ItemGroup>
    <!-- ... -->
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.9" Condition="'$(TargetFramework)' == 'net48'" />
    <!-- ... -->
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

这是https://learn.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#adding-a-packagereference-condition的修改示例,如果需要,它会提供更多详细信息。

  • 另请注意,如果您想通过框架调节多个项目,可以将 `Condition="..."` 移至 `ItemGroup`。 (6认同)