Как уже писали другие, вкратце:
совместное
повторное использование проекта на уровне кода (файла), что позволяет учитывать структуру папок и ресурсы
ПКЛ
повторное использование на уровне сборки
Что мне в большинстве случаев не хватало в ответах здесь, так это информация о сниженной функциональности, доступной в PCL: в качестве примера у вас ограничены файловые операции (мне не хватало функциональности File.IO в кроссплатформенном проекте Xamarin).
Более подробно
общий проект :
+ Может использовать #if при нацеливании на несколько платформ (например, Xamarin iOS, Android, WinPhone)
+ Все функциональные возможности фреймворка, доступные для каждого целевого проекта (хотя и должны быть скомпилированы условно)
o Интеграция во время компиляции
- немного больший размер итоговых сборок
- Требуется Visual Studio 2013 Update 2 или выше
pcl :
+ создает общую сборку
+ для использования со старыми версиями Visual Studio (обновление до 2013 года)
o динамически связанная
функциональность - lmited (подмножество всех проектов, на которые она ссылается)
Если у вас есть выбор, я бы порекомендовал пойти на общий проект, он, как правило, более гибкий и мощный. Если вы заранее знаете свои требования и PCL может выполнить их, вы также можете пойти по этому пути. PCL также обеспечивает более четкое разделение, не позволяя вам писать специфичный для платформы код (который, в первую очередь, не может быть хорошим выбором для размещения в общей сборке).
Основное внимание уделяется тому, когда вы нацеливаетесь на несколько платформ, в противном случае вы обычно используете обычный проект библиотеки / DLL.