Comme d'autres l'ont déjà écrit, en bref:
réutilisation partagée du projet au niveau du code (fichier), permettant également la structure des dossiers et les ressources
pcl
réutilisation au niveau assemblage
Ce qui me manquait le plus dans les réponses ici, ce sont les informations sur les fonctionnalités réduites disponibles dans un PCL: à titre d'exemple, les opérations sur les fichiers sont limitées (il me manquait beaucoup de fonctionnalité File.IO dans un projet multiplateforme Xamarin).
Plus en détail,
projet partagé :
+ Peut utiliser #if lors du ciblage de plusieurs plates-formes (par exemple Xamarin iOS, Android, WinPhone)
+ Toutes les fonctionnalités du framework disponibles pour chaque projet cible (mais doivent être compilées conditionnellement)
o S'intègre au moment de la compilation
- Taille légèrement plus grande des assemblys résultants
- Nécessite Visual Studio 2013 Update 2 ou supérieur
pcl :
+ génère un assemblage partagé
+ utilisable avec les anciennes versions de Visual Studio (mise à jour pré-2013 2)
o lié dynamiquement
- fonctionnalité limitée (sous-ensemble de tous les projets par lesquels il est référencé)
Si vous avez le choix, je vous conseille d'aller en projet partagé, il est généralement plus flexible et plus puissant. Si vous connaissez vos besoins à l'avance et qu'un PCL peut les satisfaire, vous pouvez également emprunter cette voie. PCL impose également une séparation plus claire en ne vous permettant pas d'écrire du code spécifique à la plate-forme (ce qui pourrait ne pas être un bon choix pour être placé dans un assembly partagé en premier lieu).
L'objectif principal des deux est lorsque vous ciblez plusieurs plates-formes, sinon vous utiliseriez normalement juste un projet de bibliothèque / dll ordinaire.