2013-01-11 10 views
17

Ich schreibe eine C# -Bibliothek für die Philips Hue Lights. Ich versuche, die Basis-API-Wrapper im portablen .NET-Set zu schreiben, so dass ich diese Bibliothek für verschiedene Plattformen wie Windows 8/RT/WP wiederverwenden kann. Die API selbst ist komplett über HTTP mit REST, so dass HttpWebRequest die meisten meiner Bedürfnisse erfüllen wird..NET Portable Class Library und UDP-Unterstützung

Die Netzwerkbrücke, die die Lichter selbst steuert, kann mit SSDP über UDP erkannt werden. Ich bin jedoch nicht in der Lage, UDP-Sockets in der Portable Class Library (PCL) zu verwenden.

Es ist kein System.Net.Sockets verfügbar. Es gibt nichts im System.Net Namespace, der es entweder erlauben würde. Ich habe eine DatagramSocket in Windows.Networking.Sockets aufgeführt, aber ich bin nicht in der Lage, diesen Namespace in Intellisense zu sehen.

Hat jemand eine Idee, wie ich UDP-Funktionalität für SSDP unter .NET PCL bekommen könnte?

Ich möchte wirklich nicht die Discovery-Funktionalität von der Core-Bibliothek trennen müssen.

Im Moment bin ich Targeting .NET 4.5 + SL 5 + WP 8 + .NET for Windows Store. Ich hatte den Eindruck, dass Sockets noch verfügbar waren.

+0

Ja, die Xbox 360 ist ** deaktiviert **. Ich kann nicht herausfinden, woraus genau die NCL bestehen soll. Jedes MSDN-Beispiel, das ich sehe, bezieht sich auf 'System.Net.Sockets', aber ich habe keinen Zugriff darauf in der _NET.PCL_. Ich fange an zu denken, dass ich den Entdeckungsteil zum tatsächlichen Programm bewegen muss, da ich UDP in irgendeiner Form auf eine tragbare Weise nicht erhalten kann. – Erik

+1

Um das .NETCore-Profil anzupassen, muss eine Klasse * einige * Gemeinsamkeiten zwischen den Plattformen haben. Es gibt einfach keine, keine Socket-Unterstützung für XBox, WP8 und Store macht es völlig anders. Sie können PCL nicht verwenden, wenn UDP wichtig ist, müssen Sie eine Plattform auswählen. –

+1

Ja, ich glaube, ich müsste Schnittstellen für die Kernarchitektur erstellen und dann jeden Satz auf der spezifischen Plattform für UDP-Netzwerke implementieren. Es scheint, dass "System.Net.Sockets" für traditionelle .NET-Anwendungen und "Windows.Networking.Sockets" für Windows Store-Anwendungen ist. – Erik

Antwort

5

Es gibt keinen gemeinsamen Schnittpunkt für die Socket-Unterstützung zwischen WinRT- und WPF-Apps. Daher ist es in PCL-Projekten, die auf sie ausgerichtet sind, nicht verfügbar.

Ich habe eine PCL-Bibliothek für WPF und WinRT, die mit einem UDP-Discovery-Netzwerk interagiert. Die sauberste Implementierung beinhaltete die Erstellung einer IUDPSocket-Schnittstelle in der PCL-Bibliothek, die Mitglieder für das Senden/Empfangen von Daten und die Verbindung mit Multicast definiert Gruppen. Die WPF-App implementiert meinen IUDPSocket mithilfe einer System.Net.Sockets.Socket, und die RT-Anwendung implementiert dies mithilfe einer Windows.Networking.Sockets.DatagramSocket.

Der Konstruktor meiner Discovery-Netzwerk-Client-Klasse (im PCL-Projekt definiert) verwendet einen Delegaten, mit dem eine Instanz des IUDPSocket erstellt wird. Ich tue dies, anstatt eine initialisierte IUDPSocket-Instanz zu übergeben, damit der aufrufende Code nicht wissen muss, um welche Ports oder Adressen es sich handelt.

+0

Ich endete damit ähnlich. Es ist schade, dass Sie 'HttpWebRequest' nicht _UDP_ für _SSDP_ verwenden können. – Erik

+0

Es gibt verschiedene Plattformen, die die 'Socket'-Klasse unterstützen: .Net, Silverlight, Windows Phone. Noch unterstützt kein PCL-Profil die Klasse. –

0

Wie diese MSDN article beschrieben, werden PCL auf gemeinsame Baugruppen für die Zielplattformen beschränkt:

In einem Portable Klassenbibliothek Projekt, können Sie die Plattformen geben Sie ausrichten möchten, und nur die unterstützten Baugruppen für Diese Plattformen werden in Ihrem Projekt referenziert. Wenn Sie versuchen, auf eine Assembly zu verweisen, die für die Zielplattformen nicht unterstützt wird, warnt Visual Studio Sie vor der Inkompatibilität. Die Kern Assemblys (Mscorlib.dll, System.dll, System.Core.dll und System.Xml.dll) werden auf allen Plattformen unterstützt.

Wie in der Übersichtstabelle des gleichen Artikels angegeben, Netzwerk-Klassenbibliothek (NCL) ist für jede Plattform, aber XBox unterstützt 360. Weitere führt die folgenden Informationen lesen:

Wenn Sie angeben, die Plattformen, die Sie in einem Portable Class Library-Projekt anvisieren möchten, werden die unterstützten Assemblies für diese Plattformen automatisch in Ihrem Projekt referenziert. Sie müssen keine Assemblys hinzufügen oder entfernen. Die referenzierten Assemblys werden automatisch aktualisiert, wenn Sie die Zielplattformen ändern.

Wahrscheinlich haben Sie also während der Projekterstellung jede Plattform ausgewählt. Wenn Sie XBox 360 deaktivieren, sollten Sie die Unterstützung für NCL und UdpClient zurückerhalten. Wenn Sie jedoch auch Unterstützung für Xbox 360 benötigen, haben Sie zwei Möglichkeiten: Wählen Sie einen Projekttyp, der nicht PCL ist, oder implementieren Sie UDP-Unterstützung manuell.

+1

Ich ziele nicht auf die Xbox 360. NCL scheint 'System.Net' zu enthalten, aber nicht' System.Net.Sockets'. Ich verstehe die Gründe für die PCL, ich dachte nur, dass 'Sockets' auf jeder Plattform (neben der Xbox) unterstützt wurden. Es scheint, dass das nicht der Fall ist. – Erik

Verwandte Themen