我正在为飞利浦Hue Lights写一个C#库。我试图在.NET便携式设备中编写基本API包装器,这样我就可以将这个库重用于各种平台,例如Windows 8 / RT / WP。 API本身使用REST遍布HTTP,因此HttpWebRequest
将满足我的大部分需求。
可以使用SSDP over UDP发现控制灯本身的网桥。但是,我无法在便携式类库(PCL)中找到使用UDP套接字的方法。
没有System.Net.Sockets
可用。 System.Net
命名空间中没有任何内容可以允许它。我看到DatagramSocket
中列出了Windows.Networking.Sockets
,但我无法在Intellisense中看到该命名空间。
有没有人知道如何在.NET PCL下获得SSDP的UDP功能?
我真的不想将发现功能与核心库分开。
目前我正在定位 .NET 4.5 + SL 5 + WP 8 + .NET for Windows Store
。我的印象是套接字仍然可用。
答案 0 :(得分:5)
WinRT和WPF应用程序之间的套接字支持没有共同点,因此在针对它们的PCL项目中不可用。
我有一个针对WPF和WinRT的PCL库,它与UDP发现网络交互,我提出的最干净的实现涉及在PCL库中创建IUDPSocket接口,该接口定义发送/接收数据和连接到多播组的成员。 WPF应用程序使用System.Net.Sockets.Socket实现我的IUDPSocket,RT应用程序使用Windows.Networking.Sockets.DatagramSocket实现此功能。
我的发现网络客户端类(在PCL项目中定义)的构造函数接受一个委托,该委托用于创建IUDPSocket的实例。我这样做而不是传入一个初始化的IUDPSocket实例,因此调用代码不必知道涉及哪个端口或地址。
答案 1 :(得分:0)
如此MSDN article所述,PCL仅限于目标平台的通用程序集:
在可移植类库项目中,指定要定位的平台,并且在项目中仅引用这些平台支持的程序集。如果您尝试引用您所针对的平台不支持的程序集,Visual Studio会警告您不兼容。所有平台都支持核心程序集(mscorlib.dll,System.dll,System.Core.dll和System.Xml.dll)。
如同一篇文章的摘要表中所述,除了XBox 360之外,每个平台都支持网络类库(NCL)。进一步阅读可以获得以下信息:
在可移植类库项目中指定要定位的平台时,将在项目中自动引用这些平台支持的程序集。您不必添加或删除程序集。如果更改目标平台,则会自动更新引用的程序集。
因此,您可能在项目创建期间选择了每个平台。禁用XBox 360应该会为您提供对NCL和UdpClient的支持。 但是,如果您还需要Xbox 360的支持,您有两种选择:选择不是PCL的项目类型或手动实现UDP支持。