17

我正在为 Philips Hue Lights 编写一个 C# 库。我正在尝试在 .NET 可移植集中编写基本 API 包装器,这样我就可以将该库重新用于各种平台,例如 Windows 8/RT/WP。API 本身是使用 REST 的 HTTP,因此HttpWebRequest可以满足我的大部分需求。

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

没有System.Net.Sockets可用的。命名空间中也没有任何System.Net允许它的东西。我在 Intellisense 中看到了一个DatagramSocket列表,Windows.Networking.Sockets但无法看到该命名空间。

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

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

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

4

2 回答 2

5

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

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

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

于 2013-01-14T14:40:13.780 回答
0

正如这篇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 支持。

于 2013-01-13T02:41:36.793 回答