2013-01-11 6 views
17

Sto scrivendo una libreria C# per Philips Hue Lights. Sto cercando di scrivere i wrapper API di base nel set portatile .NET in modo da poter riutilizzare questa libreria per varie piattaforme come Windows 8/RT/WP. L'API stessa è su tutto HTTP utilizzando REST, quindi HttpWebRequest servirà la maggior parte delle mie esigenze.Libreria di classi portatile .NET e supporto UDP

Il bridge di rete che controlla le luci stesse può essere rilevato utilizzando SSDP su UDP. Tuttavia, non riesco a trovare un modo per utilizzare i socket UDP nella libreria di classi portatile (PCL).

Non è disponibile lo System.Net.Sockets. Nulla è nello spazio dei nomi System.Net che lo consentirebbe. Ho visto uno DatagramSocket elencato in Windows.Networking.Sockets ma non riesco a vedere quello spazio dei nomi in Intellisense.

Qualcuno ha idea di come ottenere la funzionalità UDP per SSDP sotto .NET PCL?

Non voglio davvero dover separare la funzionalità di rilevamento dalla libreria principale.

In questo momento sto prendendo di mira .NET 4.5 + SL 5 + WP 8 + .NET for Windows Store. Avevo l'impressione che gli zoccoli fossero ancora disponibili.

+0

Sì, la Xbox 360 è ** deselezionata **. Non riesco a capire di cosa si debba comprendere esattamente l'NCL. Ogni esempio di MSDN che vedo fa riferimento a 'System.Net.Sockets', ma non ho accesso a quello in _.NET PCL_. Sto iniziando a pensare che dovrò spostare la porzione di scoperta nel programma attuale poiché non riesco a ottenere UDP in alcuna forma in modo portatile. – Erik

+1

Per adattarsi al profilo .NETCore, una classe deve avere * un po * di comunanza tra le piattaforme. Non ce n'è, nessun supporto socket per XBox, WP8 e Store lo fa in modo totalmente diverso. Non è possibile utilizzare PCL se UDP è importante, è necessario selezionare una piattaforma. –

+1

Sì, credo che avrei dovuto creare interfacce per l'architettura di base e quindi implementare ciascun set sulla piattaforma specifica per il networking UDP. Sembrerebbe che 'System.Net.Sockets' è per le applicazioni .NET tradizionali e' Windows.Networking.Sockets' è per le applicazioni Windows Store. – Erik

risposta

5

Non esiste un'intersezione comune per il supporto socket tra le app WinRT e WPF e pertanto non è disponibile nei progetti PCL che li riguardano.

Possiedo una libreria PCL con targeting per WPF e WinRT che interagisce con una rete di rilevamento UDP e l'implementazione più pulita che mi è venuta in mente consisteva nella creazione di un'interfaccia IUDPSocket nella libreria PCL che definisce i membri per l'invio/ricezione di dati e la connessione al multicast gruppi. L'app WPF implementa il mio IUDPSocket utilizzando un System.Net.Sockets.Socket e l'applicazione RT implementa questo utilizzando un Windows.Networking.Sockets.DatagramSocket.

Il costruttore della mia classe client di rete discovery (definita nel progetto PCL) accetta un delegato che viene utilizzato per creare un'istanza di IUDPSocket. Lo faccio invece di passare un'istanza IUDPSocket inizializzata in modo che il codice chiamante non debba sapere su quale/i porta/e/o indirizzo/i sono coinvolti.

+0

Ho finito per fare simili. È un peccato che non si possa usare 'HttpWebRequest' in un modo _UDP_ per _SSDP_. – Erik

+0

Esistono diverse piattaforme che supportano la classe 'Socket': .Net, Silverlight, Windows Phone. Tuttavia, nessun profilo PCL supporta la classe. –

0

Come descritto da questo MSDN article, PCL sono limitati a alle assemblee comuni per le piattaforme di destinazione:

In un progetto Libreria di classi Portable, si specifica le piattaforme che si desidera raggiungere, e solo i gruppi di sostegno per quelle piattaforme sono referenziate nel tuo progetto. Se provi a fare riferimento a un assembly che non è supportato per le piattaforme che hai scelto come target, Visual Studio ti avvisa dell'incompatibilità. Gli assembly principali (mscorlib.dll, System.dll, System.Core.dll e System.Xml.dll) sono supportati su tutte le piattaforme.

Come indicato nella tabella riassuntiva dello stesso articolo, Class Library Network (NCL) è supportato per tutte le piattaforme, ma Xbox 360. Ulteriore lettura porta alle seguenti informazioni:

quando si specifica il le piattaforme che si desidera utilizzare come destinazione in un progetto Libreria di classi portatile, gli assembly supportati per tali piattaforme vengono automaticamente referenziati nel progetto. Non è necessario aggiungere o rimuovere assiemi. Gli assembly referenziati vengono aggiornati automaticamente se si modificano le piattaforme di destinazione.

Quindi, probabilmente, hai selezionato ogni piattaforma durante la creazione del progetto. Disabilitare XBox 360 dovrebbe portarti il ​​supporto per NCL e UdpClient. Tuttavia, se hai bisogno di supporto anche per Xbox 360, hai due opzioni: scegliere un tipo di progetto che non è PCL o implementare manualmente il supporto UDP.

+1

Non ho come obiettivo Xbox 360. NCL sembra includere 'System.Net' ma non' System.Net.Sockets'. Capisco i motivi del PCL, ho pensato che gli 'Sockets' fossero supportati su ogni piattaforma (a parte la Xbox). Sembrerebbe che non sia il caso. – Erik