Come altri hanno già scritto, in breve:
riutilizzo del progetto condiviso a livello di codice (file), consentendo anche la struttura e le risorse delle cartelle
pcl
riutilizzo a livello di assieme
Quello che mi è mancato principalmente delle risposte qui per me sono le informazioni sulla funzionalità ridotta disponibile in un PCL: ad esempio hai limitato le operazioni sui file (mi mancava molta funzionalità di File.IO in un progetto multipiattaforma Xamarin).
Più in dettaglio
progetto condiviso :
+ Può usare #if quando si sceglie come target più piattaforme (ad es. Xamarin iOS, Android, WinPhone)
+ Tutte le funzionalità del framework disponibili per ciascun progetto target (anche se devono essere compilate in modo condizionale)
o Si integra al momento della compilazione
- Dimensioni leggermente più grandi degli assembly risultanti
- Richiede Visual Studio 2013 Update 2 o successivo
pcl :
+ genera un assembly condiviso
+ utilizzabile con versioni precedenti di Visual Studio (aggiornamento 2 precedente al 2013)
o collegato dinamicamente
- funzionalità lmited (sottoinsieme di tutti i progetti a cui fa riferimento)
Se hai la scelta, consiglierei di andare per un progetto condiviso, è generalmente più flessibile e più potente. Se conosci i tuoi requisiti in anticipo e un PCL può soddisfarli, potresti seguire anche questa strada. PCL impone inoltre una separazione più chiara non consentendo di scrivere codice specifico per la piattaforma (che potrebbe non essere una buona scelta da inserire in un assembly condiviso in primo luogo).
L'obiettivo principale di entrambi è quando si prendono di mira più piattaforme, altrimenti normalmente si userebbe solo un normale progetto libreria / dll.