2013-01-11 77 views
17

我正在为飞利浦Hue灯编写一个C#库。我正在尝试在.NET便携式设置中编写基础API包装,这样我可以在Windows 8/RT/WP等各种平台上重新使用此库。 API本身都是使用REST的HTTP,因此HttpWebRequest将满足我的大部分需求。.NET便携式类库和UDP支持

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

有没有System.Net.Sockets可用。 System.Net命名空间中没有任何东西可以允许它。我看到Windows.Networking.Sockets中列出DatagramSocket,但我无法在Intellisense中看到该名称空间。

有没有人有任何想法如何我可以在.NET PCL下获得SSDP的UDP功能?

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

现在我的目标是.NET 4.5 + SL 5 + WP 8 + .NET for Windows Store。我的印象是插座仍然可用。

+0

是的,Xbox 360是**取消选中**。我无法弄清楚NCL应该由什么组成。我看到的每个MSDN示例都引用了'System.Net.Sockets',但我无法访问_.NET PCL_中的那个。 我开始认为我将不得不将发现部分移动到实际的程序中,因为我无法以便携方式获取任何形式的UDP。 – Erik

+1

为了适应.NETCore配置文件,一个类必须具有*一些*平台之间的通用性。 XBox,WP8和Store都没有任何支持,完全不同。如果UDP很重要,你不能使用PCL,你必须选择一个平台。 –

+1

是的,我相信我必须为核心架构创建接口,然后在特定的UDP网络平台上实现每个集合。 似乎'System.Net.Sockets'是用于传统的.NET应用程序,'Windows.Networking.Sockets'用于Windows应用商店的应用程序。 – Erik

回答

5

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

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

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

+0

我最终做了类似的事情。遗憾的是,你不能以_UDP_方式为_SSDP_使用'HttpWebRequest'。 – Erik

+0

有不同的平台支持'Socket'类:.Net,Silverlight,Windows Phone。但是,没有PCL配置文件支持该类。 –

0

正如本MSDN article描述,PCL仅限于共同组件目标平台:

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

正如在同一篇文章的汇总表所述,网络类库(NCL)支持每一个平台,但Xbox 360的进一步阅读导致了以下信息:

当您指定想要在Portable Class Library项目中定位的平台,这些平台的受支持组件会在您的项目中自动引用。您不必添加或删除程序集。如果更改目标平台,则引用的程序集会自动更新。

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

+1

我不是针对Xbox 360的.NCL似乎包含'System.Net',但不包括'System.Net.Sockets'。 我明白PCL的原因,我只是认为每个平台上都支持'Sockets'(Xbox除外)。看起来情况并非如此。 – Erik