为啥必须在 UWP 中使用 StreamSocketListener 而不是 TcpListener,尽管 UWP 是 .NET Core 的子集,而 TcpListener 在 UWP 中可用?

Posted

技术标签:

【中文标题】为啥必须在 UWP 中使用 StreamSocketListener 而不是 TcpListener,尽管 UWP 是 .NET Core 的子集,而 TcpListener 在 UWP 中可用?【英文标题】:Why must StreamSocketListener be used in UWP instead of TcpListener, although UWP is a subset of .NET Core and TcpListener is available in UWP?为什么必须在 UWP 中使用 StreamSocketListener 而不是 TcpListener,尽管 UWP 是 .NET Core 的子集,而 TcpListener 在 UWP 中可用? 【发布时间】:2019-12-13 20:50:38 【问题描述】:

如here 和here 所述,TcpListener 的使用在 UWP 中是不可能的。相反,必须使用 StreamSocketListener。

但是经过比较长时间的研究,我不明白为什么?

由于 UWP 实际上是 .NET Core 的子集,因此在 UWP 中也应该可以使用 TcpListener!

只是为了测试,我 甚至创建了一个 UWP 项目,尝试使用 System.Net.Sockets.TcpListener 在代码中,没有问题。我没有写完整的代码 并没有尝试运行服务器,只是尝试引用 System.Net.Sockets.TcpListener 来自 UWP 项目,这是 可能的。难怪,因为即使根据微软文档 (https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.tcplistener?view=netcore-1.0) 该类从 .NET Core 1.0 开始可用。

【问题讨论】:

“UWP 实际上是 .NET Core 的一个子集”是另一个典型的误解。尽管 UWP/.NET Core 共享许多共同部分,但它们是不同的目标平台,这就是为什么只有 .NET Standard 才能将它们桥接在一起。 哦!那么这张图是不是错了i.stack.imgur.com/nl9gf.png? 您可能会参考最新的图表,例如devblogs.microsoft.com/dotnet/introducing-net-5 您不应该期望图表总是能说出所有真相,因为作者可能只是懒得为 UWP 单独绘制一个矩形。 好吧,实际上我并不仅仅依赖于图表,我在这里的答案中遇到了图表:***.com/a/53531324/9514066 那里的人明确表示 UWP 是 .NET Core 的子集,他故意用图表来说明他的观点 那么很明显,这个答案立即被质疑具有误导性,并且微软在他们以后的官方博客文章中不再使用这样的图表。 【参考方案1】:

较新版本的 UWP 支持 .NET Standard 2.0,其中包括许多在早期版本的 UWP 中不可用的 API。

参见例如:https://devblogs.microsoft.com/dotnet/announcing-uwp-support-for-net-standard-2-0/

【讨论】:

根据文档(查看我在问题中提到的链接),TcpListener 适用于:.NET Core 1.0。这意味着,它应该在所有 UWP 版本中都可用 @user9514066 你误解了那个页面。当您使用 UWP 时,唯一适用的项目是“.NET Standard”,这意味着如果您的项目目标的 UWP 版本已经实现了某个 .NET Standard 版本,那么TcpListener 应该可以完美地在那里工作。

以上是关于为啥必须在 UWP 中使用 StreamSocketListener 而不是 TcpListener,尽管 UWP 是 .NET Core 的子集,而 TcpListener 在 UWP 中可用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 midiOutOpen 在 UWP 应用程序中返回 1(=未指定错误)?

为啥我的 .UWP 模拟器无法在 Visual Studio 中启动?

为啥我的发行版 .exe 在启动 UWP 应用程序时失败?

为啥我的受 AAD 保护的 Azure 函数在使用来自 UWP 应用的访问令牌调用时返回 401?

WinUI 3.0 - 为啥 UWP 项目要求 MS Edge for Business 用于 WebView2

为啥 UWP WebView AddWebAllowedObject 不起作用?