C# .NET可移植类库和UDP支持

C# .NET可移植类库和UDP支持,c#,.net,networking,udp,philips-hue,C#,.net,Networking,Udp,Philips Hue,我正在为飞利浦色调灯编写一个C#库。我正在尝试在.NET可移植集中编写基本API包装,这样我就可以在各种平台(如Windows 8/RT/WP)上重用此库。API本身使用REST在HTTP上运行,因此HttpWebRequest将满足我的大部分需求 通过UDP使用SSDP可以发现控制灯光本身的网桥。但是,我无法找到在可移植类库(PCL)中使用UDP套接字的方法 没有可用的System.Net.Sockets。System.Net命名空间中也没有允许它的内容。我在Windows.Networkin

我正在为飞利浦色调灯编写一个C#库。我正在尝试在.NET可移植集中编写基本API包装,这样我就可以在各种平台(如Windows 8/RT/WP)上重用此库。API本身使用REST在HTTP上运行,因此
HttpWebRequest
将满足我的大部分需求

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

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

有人知道我如何在.NET PCL下获得SSDP的UDP功能吗

我真的不想将发现功能与核心库分离

现在我的目标是针对Windows应用商店的.NET 4.5+SL 5+WP 8+.NET。我的印象是插座仍然可用。

如本文所述,PCL仅限于目标平台的通用组件:

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

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

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

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

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

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


my discovery network client类(在PCL项目中定义)的构造函数接受用于创建IUDPSocket实例的委托。我这样做,而不是传递初始化的IUDPSocket实例,这样调用代码就不必知道涉及哪些端口或地址。

是的,Xbox 360未选中。我不知道NCL到底应该由什么组成。我看到的每个MSDN示例都引用了
System.Net.Sockets
,但我在.Net PCL中没有访问该示例的权限。我开始认为,我必须将发现部分移动到实际的程序中,因为我无法以可移植的方式获取任何形式的UDP。为了适应.NETCore配置文件,一个类必须在平台之间具有一些公共性。XBox没有任何套接字支持,WP8和Store完全不同。你不能使用PCL如果UDP很重要,你必须选择一个平台。是的,我相信我必须为核心架构创建接口,然后在特定的平台上实现每一套UDP网络。似乎
System.Net.Sockets
适用于传统的.Net应用程序,而
Windows.Networking.Sockets
适用于Windows应用商店应用程序。@HansPassant.Net、SL4、WP7都有
Socket
类。PCL中仍然没有任何内容。你需要和David Kean谈谈,微软没有雇用我。我不是针对Xbox 360。NCL似乎包括
System.Net
,但不包括
System.Net.Sockets
。我理解PCL的原因,我只是认为每个平台(Xbox除外)都支持
Sockets
。看起来情况并非如此,我最终也做了类似的事情。遗憾的是,您不能以UDP方式为SSDP使用
HttpWebRequest
。有不同的平台支持
Socket
类:.Net、Silverlight、Windows Phone。但是,没有PCL配置文件支持该类。