2013-01-11 81 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