.NET可移植类库和UDP支持

我正在为飞利浦Hue Lights写一个C#库。 我试图在.NET便携式设备中编写基本API包装器,这样我就可以将这个库重用于各种平台,例如Windows 8 / RT / WP。 API本身使用REST遍布HTTP,因此HttpWebRequest将满足我的大部分需求。

可以使用SSDP over UDP发现控制灯本身的网桥。 但是,我无法找到在便携式类库(PCL)中使用UDP套接字的方法。

没有可用的System.Net.SocketsSystem.Net命名空间中没有任何内容可以允许它。 我在Windows.Networking.Sockets看到了一个DatagramSocket ,但是我无法在Intellisense中看到该命名空间。

有谁知道如何在.NET PCL下获得SSDP的UDPfunction?

我真的不想将发现function与核心库分开。

现在我的目标是针对.NET 4.5 + SL 5 + WP 8 + .NET for Windows Store 。 我的印象是套接字仍然可用。

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

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

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

如本MSDN文章所述 ,PCL仅限于目标平台的通用程序集:

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

如同一篇文章的摘要表中所述,除了XBox 360之外,每个平台都支持网络类库(NCL)。进一步阅读可以获得以下信息:

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

因此,您可能在项目创建期间选择了每个平台。 禁用XBox 360应该会为您提供对NCL和UdpClient的支持。 但是,如果您还需要Xbox 360的支持,您有两种选择:选择不是PCL的项目类型或手动实现UDP支持。