. net可移植类库和UDP支持

本文关键字:UDP 支持 类库 可移植 net | 更新日期: 2023-09-27 17:52:33

我正在为飞利浦色相灯编写一个c#库。我正在尝试在。net可移植集中编写基本API包装器,这样我就可以在各种平台(如Windows 8/RT/WP)上重用该库。API本身是通过HTTP使用REST,所以HttpWebRequest将满足我的大部分需求。

控制灯本身的网桥可以使用UDP上的SSDP来发现。然而,我无法找到一种在可移植类库(PCL)中使用UDP套接字的方法。

没有可用的System.Net.Sockets。在System.Net名称空间中也没有任何东西允许这样做。我已经看到Windows.Networking.Sockets中列出的DatagramSocket,但无法在智能感知中看到该名称空间。

有没有人知道我如何在。net PCL下获得SSDP的UDP功能?

我真的不想把发现功能从核心库中分离出来。

现在我瞄准 .NET 4.5 + SL 5 + WP 8 + .NET for Windows Store

. net可移植类库和UDP支持

对于WinRT和WPF应用程序之间的套接字支持没有共同的交叉点,因此在针对它们的PCL项目中不可用。

我有一个针对WPF和WinRT的PCL库,它与UDP发现网络交互,我想出的最干净的实现涉及在PCL库中创建一个IUDPSocket接口,该接口定义了用于发送/接收数据和连接到多播组的成员。WPF应用程序使用System.Net.Sockets实现我的IUDPSocket。Socket, RT应用程序使用Windows.Networking.Sockets.DatagramSocket来实现它。

我的发现网络客户端类(在PCL项目中定义)的构造函数接受一个委托,该委托用于创建IUDPSocket的实例。我这样做,而不是传入一个初始化的IUDPSocket实例,这样调用代码就不必知道涉及到哪个端口或地址。

正如这篇MSDN文章所描述的,PCL仅限于目标平台的公共程序集:

在可移植类库项目中,您可以指定要瞄准的平台,并且在您的项目中仅引用这些平台的受支持程序集。如果您试图引用不支持您所针对的平台的程序集,Visual Studio会警告您不兼容性。核心程序集(mscorlib.dll, System.dll, System.Core.dll和System.Xml.dll)在所有平台上都支持。

如同一篇文章的汇总表所述,网络类库(NCL)支持除XBox 360以外的所有平台。进一步阅读可得到以下信息:

当您在可移植类库项目中指定您想要的目标平台时,这些平台的支持程序集将在您的项目中自动引用。您不必添加或删除程序集。如果您更改了目标平台,则会自动更新所引用的程序集。

因此,您可能在项目创建期间选择了每个平台。禁用XBox 360应该会让你恢复对NCL和UdpClient的支持。然而,如果你也需要支持Xbox 360,你有两个选择:选择一个不是PCL的项目类型或手动实现UDP支持。