从完整框架项目中引用.NET5.0程序集?
我们所有的产品(WPF 应用程序)仍然使用 v4.6.1,这有点落后于时代。我目前正在使用 .NET 5,并将我们的一个类库(由许多这些产品使用)转换为 v5。我现在试图从我们的一个较小的产品中引用这个程序集,但它没有构建,有很多错误,例如:
依赖关系“System.Runtime,Version=5.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”。1> 无法解析此引用。无法找到程序集“System.Runtime,Version=5.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”
我的印象是 .NET 5 向后兼容,还是仅适用于 .NET Standard?(TBH 我一直在努力理解整个 .NET Standard/Core 的事情)。
我们还不想冒险将产品转换为 .NET 5 - 这是一项长期战略。在我们开始时将上述类库转换为准备好会很好,那么 .NET 框架解决方案有什么方法可以引用 .NET 5 程序集吗?我猜这是不可能的,唯一的选择是多目标?如果是这样,我该怎么做,它会回到 v4.6.1 吗?或者我们是否坚持将所有内容同时转换为 .NET 5 的“大爆炸”方法?
不确定它是否相关,但在bindebug类库的文件夹中,我可以看到各种子文件夹,例如net5.0, net5.0-windows, net472, netstandard2.1- 仅net5.0-windows包含构建的 DLL。如果这是最低限度,我们也许可以使用 4.7.2,但我一开始不知道如何进行多目标。在“目标框架”下拉列表中,我只看到 .NET 5.0、.NET Core 3.0、.NET Core 3.1。
编辑 1
我按照下面卡米洛的建议替换为:
<TargetFrameworks>net5.0-windows;net461</TargetFrameworks>
现在,代码不会构建。看一个例子,它似乎在抱怨它可以找到 .Net5 但不是 4.6.1 的类型“ItemsControl”:
我假设我需要以某种方式为 v4.6.1 添加 System.Windows.Controls,尽管这充其量是不直观的 - 因为在 .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 中可用,这就是为什么您不能定位低于它的任何版本。
让我们看看一些选项:
- 类库包含实用程序类、配置和类似的东西,它们与框架无关。
该库应面向 .NET Standard 2.0:
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>netstandard2.0</TargetFramework>
- 类库有一些依赖于框架的引用(如 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 文档以找到它所在的库),如下所示:
- 类库有一些依赖于框架的引用(如 WPF),但您不希望多目标或到处放置预处理器指令。
创建第二个项目,仅针对 .NET 5,复制可以重复使用的代码部分,然后从头开始无法移动的部分。