从完整框架项目中引用 .NET 5.0 程序集?

Reference a .NET 5.0 assembly from a full framework project?

我们的所有产品(WPF 应用程序)仍在使用 v4.6.1,这有点落伍了。我目前正在玩 .NET 5,并将我们的一个 class 库(被许多这些产品使用)转换为 v5。我现在正试图从我们的一个较小的产品中引用这个程序集,但它没有构建,有很多错误,例如:

Dependency "System.Runtime, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". 1> Could not resolve this reference. Could not locate the assembly "System.Runtime, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

我的印象是 .NET 5 向后兼容,还是仅适用于 .NET Standard? (说实话,我一直在努力了解整个 .NET Standard/Core 的事情)。

我们还不想冒险将产品转换为 .NET 5 - 这是一项长期战略。如果我们开始时将上面的 class 库转换为准备就绪,那就太好了,那么 .NET Framework 解决方案有什么方法可以引用 .NET 5 程序集吗?我猜这是不可能的,唯一的选择是多目标?如果是这样,我该怎么做,它会回到 v4.6.1 吗?还是我们坚持将所有内容同时转换为 .NET 5 的“大爆炸”方法?

不确定它是否相关,但在 class 库的 \bin\debug\ 文件夹中我可以看到各种子文件夹,例如 net5.0net5.0-windowsnet472, netstandard2.1 - 只有 net5.0-windows 包含内置的 DLL。如果 4.7.2 是最低限度的话,我们也许可以使用 4.7.2,但我一开始就不知道如何进行多目标。在“目标框架”下拉列表中,我只看到 .NET 5.0、.NET Core 3.0、.NET Core 3.1。

编辑 1

我按照下面 Camilo 的建议替换为:

<TargetFrameworks>net5.0-windows;net461</TargetFrameworks>

现在,代码无法构建。查看一个示例,它似乎在抱怨它可以为 .Net5 找到类型“ItemsControl”,但不能为 4.6.1 找到类型:

我假设我需要以某种方式为 v4.6.1 添加 System.Windows.Controls,尽管这充其量是不直观的 - 因为没有添加引用 -> 程序集 window 你会发现在 .Net 框架应用程序中。我假设这现在必须通过 NuGet 完成,如果是这样,我需要哪个包?

.NET Standard 2.0 是最后一个与.NET Framework 兼容的目标框架。 .NET Standard 2.1 只是 .NET Core 3.0 和更新版本。 .NET 5 与 .NET 5 和更新版本兼容(当它们发布时)。

请注意,WPF 端口在 .NET Core 3.0 中变得可用,因此您无法定位低于它的任何版本。

让我们看看一些选项:

  1. class 库包含实用程序 classes、配置和类似的东西,它们与框架无关。

该库应以 .NET Standard 2.0 为目标:

<TargetFramework>netstandard2.0</TargetFramework>
  1. class 库有一些依赖于框架的引用(如 WPF),你想要多目标。

该库将面向 .NET Framework 4.6.1 和 .NET 5:

<TargetFrameworks>net461;net5.0</TargetFrameworks>

请注意,您可能需要在许多地方添加 #if 指令,例如(但是,不要在标识符上引用我的话):

#if NET461 // something that only exists in .NET Framework 4.6.1
#elif NET50 // something that only exists in .NET 5.0
#endif

您可能面临的另一个问题是无法在其中一个目标中找到引用。在这种情况下,您可以有条件地导入引用(您可以查看 Microsoft Docs 文档中的 class 以找到它所在的库),如下所示:

<ItemGroup Condition="'$(TargetFramework)' == 'net461'">
    <Reference Include="PresentationCore" />
</ItemGroup>
  1. class 库有一些依赖于框架的引用(如 WPF),但您不想多目标或将预处理器指令放在各处。

创建第二个项目,仅针对 .NET 5,复制代码中可以重用的部分,并从头开始无法移动的部分。