2013-05-09 14 views
11

Sto lavorando per estendere il numero di piattaforme supportate per la mia app, utilizzato per supportare .NET4/Windows Store/Windows Phone, ma spero di coprire anche Mono per Android e iOS. Ho messo tutte le logiche di business, i modelli e i modelli di visualizzazione in librerie di classi portatili (PCL), ma è un grosso dilemma quale sottoinsieme di piattaforme dovrei scegliere. Ogni combinazione fa fallire qualcosa. Ecco i risultati per 4 piattaforme che potrei utilizzare:Ricerca del miglior profilo PCL per lo sviluppo multipiattaforma

Profilo 78 (NET45 + WP8 + Store): nessun problema con TPL, attesa/asincrona e supporto per l'attributo CallerMemberName (utilizzato nella classe base del modello di visualizzazione BindableBase). Ma il progetto Mono.Android che fa riferimento a tale libreria non riesce a creare lamentele su System.Runtime.dll non presente che dovrebbe essere referenziato.

Profilo 104 (NET45 + SL4 + WP75 + Store): attendere/asincrono non funzionano, nome CallerMember non trovato, ma se rimuovo tutti i riferimenti ad essi, il progetto Android si integra perfettamente.

Profilo 147 (NET403 + SL5 + WP8 + Store): attendere/asincrono non funzionano, nome CallerMember non trovato, ma se rimuovo tutti i riferimenti ad essi, il progetto Android si integra perfettamente.

Profilo 158 (NET45 + SL5 + WP8 + Store): attendere/asincrono non funzionano, nome CallerMember non trovato, ma se rimuovo tutti i riferimenti ad essi, il progetto Android si integra perfettamente.

Quindi non sono proprio sicuro di cosa scegliere. I profili 78, 104, 147 sono limitati, il profilo 78 è l'unico che supporta sia Attesa/Async che CallerMemberName utilizzato BindableBase, ma non riesce su Android lamentandosi di System.Runtime.dll. Quindi, se hai esperienza con quale profilo PCL è la migliore corrispondenza per il targeting PCL Mono, per favore condividi le tue opinioni.

+0

Assicurarsi di utilizzare 'Microsoft.Bcl.Async' (che dipende da' Microsoft.Bcl'). Questi aggiungono il supporto async/await/CallerMemberName ai profili 104/147/158. –

+0

Microsoft.Bcl.Async può essere distribuito solo su piattaforma Windows (finora). No mono. –

+0

La licenza di @VagifAbilov è stata modificata su Microsoft.Bcl.Async http://www.hanselman.com/blog/PortableClassLibrariesJustGotREALLYUsefulWithNewLicensingChanges.aspx –

risposta

11

Pensare ai numeri di profilo è difficile - preferisco pensare in termini di piattaforme.

Idealmente mi piacerebbe i miei progetti per sostenere:

  • Net 3.5 e superiori
  • SL3 e superiori
  • telefono WP7.x e superiori
  • MonoDroid 1.6 e superiori
  • MonoTouch iOS6 e versioni successive
  • (Mac OSX Lion per desktop)

Il progetto PCL principale che supporto è MvvmCross, che richiede le strutture Mvvm come ICommand. Queste strutture sono disponibili solo nelle piattaforme per NET 4.5 e superiori ... questo è un limite rigido - nulla che io possa fare a questo proposito - così cambia le mie esigenze a:

  • Net 3.5 e superiori .Net 4.5
  • SL3 e superiori SL4 in alto
  • telefono WP7.x e superiori
  • MonoDroid 1.6 e superiori
  • MonoTouch iOS6 e superiori
  • (Mac desktop di OS X Lion)

Con questa selezione a posto, allora questo mi porta a un numero di profilo - 104 (idea di come la piattaforma ha deciso questo. .. ha rinunciato a chiedere molto tempo fa!)

Quindi ho preso di mira MvvmCross al profilo 104 - e resterà lì mentre il supporto WP7.x è ancora necessario.

Questa scelta non significa che non può MvvmCross out-of-the-box di supporto cose come async/await e CallerMemberName - ma questo è un compromesso che abbiamo deciso di fare - abbiamo gli utenti che necessità WP7.


Tuttavia, alcune domande degli utenti attendono/asincrone ...

Per utilizzare queste nuove funzionalità, ci sono alcuni BCL.Async Nuget hack per farli lavorare di profilo 104 ... o questi gli utenti possono indirizzare le proprie app su un profilo più recente (che non supporta WP7.x e SL4) - questo li porta a costruire le loro app nel profilo 78, ma ad aggiungere riferimenti al mio profilo 104 assiemi.

Nessuno di questi gruppi di soluzioni funziona molto bene con i gemelli Xamarin attualmente - ad es. si riscontrano problemi come l'assembly System.Runtime.dll mancante. Tuttavia, prevedo che quando Xamarin supporta ufficialmente i PCL (e dopo alcuni test alpha/beta), questi problemi verranno risolti. Questo supporto ufficiale è dovuto molto presto - è per questo che non si preoccupano spendere troppo del mio tempo a pensare a questi problemi ...


mi aspetto nel medio periodo che MvvmCross cadrà il supporto per WP7 .x e SL4. Quando ciò accade, si può anche spostare le librerie di base al profilo 78.


L'unica altra grande piattaforma So che ha avviato supporto PCL è ReactiveUI. Credo che questa piattaforma deve utilizzare profilo 78 perché la versione PCL di Reactive da Microsoft ha come target 78.

+0

Grazie Stuart, ottima risposta come sempre. Devo controllare l'importanza di BindableBase per la mia app. Immagino che tu abbia programmato un ricambio per questo in MvvmCross. –

+0

Dunno - cos'è BindableBase? È solo https://github.com/slodge/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross/ViewModels/MvxNotifyPropertyChanged.cs con i metodi 'CallerMemberName' aggiunti? – Stuart

+1

La parte essenziale di BindableBase è questo: SetProperty (stoccaggio T ref, valore T, [CallerMemberName] String propertyName = null) Quindi è più che MvxNotifyPropertyChanged. –

Problemi correlati