.NET可移植类库和UDP支持

17

我正在编写一个针对Philips Hue灯的C#库。我试图在.NET portable set中编写基本API包装器,以便我可以在各种平台上重复使用这个库,比如Windows 8/RT/WP。API本身都是通过REST使用HTTP,因此HttpWebRequest将满足我的大部分需求。

控制灯光本身的网络桥可以使用SSDP over UDP进行发现。然而,在可移植类库(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进行目标设置。我认为套接字仍然可用。


是的,Xbox 360是未经检查的。我无法弄清楚NCL应该包含什么。我看到的每个MSDN示例都引用了System.Net.Sockets,但我在_.NET PCL_中没有访问权限。我开始认为我将不得不将发现部分移动到实际程序中,因为我无法以可移植的方式获取任何形式的UDP。 - Erik
1
为适应.NETCore框架,类必须在平台之间具有一些共性。但是,在XBox、WP8和Store上完全没有套接字支持。如果UDP很重要,则无法使用PCL,你必须选择一个平台。 - Hans Passant
1
是的,我相信我需要为核心架构创建接口,然后在特定平台上实现每个集合以进行UDP网络编程。看起来 System.Net.Sockets 适用于传统的.NET应用程序,而 Windows.Networking.Sockets 则适用于Windows Store应用程序。 - Erik
@HansPassant .Net、SL4和WP7都有Socket类。但在PCL中仍然没有。 - Ark-kun
你需要与David Kean交谈,微软没有雇用我。 - Hans Passant
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实例。


我最终做了类似的事情。遗憾的是,你不能在SSDP中以_UDP_方式使用HttpWebRequest - Erik
有不同的平台支持Socket类:.Net、Silverlight、Windows Phone。然而,没有PCL配置文件支持该类。 - Ark-kun

0
根据MSDN文章所述,PCL仅限于针对目标平台的公共程序集:
在可移植类库项目中,您可以指定要针对的平台,并且只有这些平台支持的程序集才会被引用到您的项目中。如果您尝试引用不支持您所针对的平台的程序集,则Visual Studio会警告您不兼容。核心程序集(mscorlib.dll、System.dll、System.Core.dll和System.Xml.dll)在所有平台上都受支持。
如同相同文章的摘要表格所述,网络类库(NCL)在除XBox 360之外的所有平台上都受支持。进一步阅读将导致以下信息:
当您在可移植类库项目中指定要针对的平台时,这些平台支持的程序集会自动引用到您的项目中。您无需添加或删除程序集。如果您更改目标平台,则引用的程序集会自动更新。

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


1
我不是针对Xbox 360。NCL似乎包括System.Net但不包括System.Net.Sockets。我理解PCL的原因,只是我认为除了Xbox之外,Sockets在每个平台上都受支持。看来情况并非如此。 - Erik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接