为什么我不能在 Windows 通用应用程序中引用 .Net Core 1.0 程序集?

Why can't I reference a .Net Core 1.0 assembly in a Windows Universal app?

我在家使用 Visual Studio 2017 社区版,并尝试制作我的第一个通用 Windows 应用程序。该解决方案有两个程序集,一个用于 UI,另一个用于纯计算。一切都很好,直到我尝试从 UI 程序集引用计算程序集。它拒绝添加参考。起初,根据我的阅读,我认为这是目标版本不兼容的问题,但即使我使计算目标尽可能低,UI 目标尽可能高,也没有什么区别.

无论哪种方式,结果都是一样的。当我去 Projects > Add Reference ... > Projects/Solution > select other_assembly 并点击 OK,它只是说

"Unable to add reference to project 'other_assembly'."

没有解释,没有细节。

这里有什么障碍?我怎样才能解决这个问题,或者至少得到错误是什么的详细描述?

如果我将所有计算源文件复制到 UI 程序集中,一切都可以构建,但我希望能够支持多个平台。

请查看以下屏幕截图,UWP 是 .NET Core 的子集。它还具有许多 UWP 独有的 API。 UWP 应用程序可以是 .NET 核心应用程序,但 不一定如此。并非所有 .NET 核心应用都是 UWP 应用。 UWP 仅适用于 windows 生态系统。

正如@magicandre1981 所说,更好的方法是将 .netcore class 库移植到 .net 标准 2.0,可以使用 uwp 最小目标版本到 16299。对于 .net 标准,请参考此 document.

所以当我们在VS2017中创建跨平台(例如可以在Linux系统上使用)class库时我们有两种选择,一种是针对.NET Core , 另一个目标是 .NET Standard

虽然 .NET Core.NET Standard 已经存在了几年,但它们仍然让我们大多数人感到困惑。幸运的是,我们有很多 a lot of references 可以在线阅读。您可以 Google,或者只是在 Whosebug 上找到投票最多的答案。

我想分享一下我学习这个的经验。在我开始在我的 Ubuntu 系统上编写 .NET Core 应用程序后,我才完全理解这一点。

.NET Core 是关于应用程序能够 运行 在多个平台上 ,所以你有一个 .NET Core 控制台应用程序,或者 ASP.NET 核心应用程序,您可以 运行 在 Windows 或 Ubuntu 上使用相同的“dotnet 运行”命令的应用程序无需修改一行代码。

目前 .NET Core 仅支持两种项目类型,Console 和 ASP.NET Core。 UWP 仍然是严格的 Windows,您不能编写 UWP 应用程序并期望它在 OS 而不是 Windows 上达到 运行。

另一方面,.NET Standard 是关于在不同的 .NET 应用程序之间共享 class 库代码 - Windows Forms、WPF、UWP、Mono、ASP.NET 核心,无论它是什么项目类型。 因为它们都必须实现某个版本的 .NET Standard。这意味着如果库被编译为针对非常低版本的 .NET Standard(如 1.0),那么所有人都可以引用该库,是的,甚至是 WinForms(.NET Platform 4.5 或更高版本)。

所以让我们回到问题上来,如果你将class库编译为目标.NET Core,那么它只能被.NET Core应用程序使用,UWP应用程序无法引用它因为 UWP 不是跨平台的(UWP 只是跨屏,运行ning 在不同的 Windows 10 种屏幕尺寸不同的设备上;))

一个月后更新:当我写这个答案时,我从未听说过 MS 计划在 2019 年发布 .NET Core 3.0 - 他们将添加对 WinFormsWPF 到 .NET Core 的下一个主要版本,这意味着我的第一点 .NET Core 是关于应用程序跨平台的 会有些误导。