В чем разница между общим проектом и библиотекой классов в Visual Studio 2015?

240

Я смотрел на новые функции для Visual Studio 2015, и Shared Project часто появлялся, но я не понимаю, чем он отличается от использования библиотеки классов или переносимой библиотеки классов. Кто-нибудь может объяснить?

Изменить: Общий проект является новой функцией в Visual Studio 2015 и отличается от Portable Class Library. Я понимаю, что такое Portable Class Library. Я пытаюсь понять, как общий проект отличается от библиотеки классов. Смотрите ссылку ниже.

http://www.c-sharpcorner.com/UploadFile/7ca517/shared-project-an-impressive-features-of-visual-studio-201/

Indy411
источник

Ответы:

238

Разница между общим проектом и библиотекой классов заключается в том, что последний компилируется, а единицей повторного использования является сборка.

В то время как в первом случае единица повторного использования является исходным кодом, и общий код включается в каждую сборку, которая ссылается на общий проект.

Это может быть полезно, когда вы хотите создать отдельные сборки, предназначенные для конкретных платформ, но при этом имеющие код, который должен быть предоставлен в общий доступ.

Смотрите также здесь :

Ссылка на общий проект отображается в узле «Ссылки» в обозревателе решений, но код и ресурсы в общем проекте обрабатываются так, как если бы они были файлами, связанными с основным проектом.


В предыдущих версиях Visual Studio 1 вы могли обмениваться исходным кодом между проектами, добавив -> Существующий элемент и затем выбрав ссылку. Но это было немного неуклюже, и каждый отдельный исходный файл нужно было выбирать индивидуально. Перейдя на поддержку нескольких разнородных платформ (iOS, Android и т. Д.), Они решили упростить обмен исходными текстами между проектами, добавив концепцию общих проектов.


1 Этот вопрос и мой ответ (до сих пор) предполагают, что общие проекты были новой функцией в Visual Studio 2015. Фактически, они дебютировали в Visual Studio 2013 Update 2

Damien_The_Unbeliever
источник
1
Скажем, два проекта, которые ссылаются на один общий проект. Если один из них добавляет ссылку на другой, вы получаете ошибки объявления дублирующихся типов?
Асад Саидуддин
3
@Asad - Я не проверял, но я не ожидал. У вас может быть два разных типа с одинаковыми именами, которые объявлены в одних и тех же пространствах имен, но существуют в разных сборках. Это не ошибка, по сути.
Damien_The_Unbeliever
У меня был тот же вопрос, что и у ОП в 2017 году, но так как у нас сейчас стандарт .net 2.0 . Разве общие проекты не устарели? Если бы вы создали новое веб-приложение или приложение uwp сегодня?
JP
1
@JPHellemons - стандарт .net хорош - но если вам нужно выйти за рамки этого по какой-либо причине (например, если функциональность доступна только на определенных платформах), тогда Shared Project все еще может быть достойным подходом.
Damien_The_Unbeliever
1
Мы говорим, что с общим проектом мы можем делиться файлами Javascript. Как мы используем это в bundleConfig?
Leth
34

Я нашел больше информации из этого блога .

  • В библиотеке классов, когда код компилируется, сборки (dll) генерируются для каждой библиотеки. Но с Shared Project он не будет содержать никакой информации заголовка, поэтому, когда у вас есть ссылка на Shared Project, он будет скомпилирован как часть родительского приложения. Там не будут созданы отдельные библиотеки.
  • В библиотеке классов вы можете писать только код C #, в то время как общий проект может иметь любую вещь, такую ​​как файлы кода C #, файлы XAML или файлы JavaScript и т. Д.
Indy411
источник
7
библиотека классов также может иметь .xaml (пользовательские элементы управления)
умолчанию
21

Короткие различия

1) У PCL не будет полного доступа к .NET Framework, как у SharedProject.

2) #ifdef для специфичного для платформы кода - вы не можете писать в PCL ( опция #ifdef недоступна в PCL, потому что она компилируется отдельно, как собственная DLL, так и во время компиляции (когда оценивается #ifdef) он не знает, на какой платформе он будет. ) где вы можете использовать как общий проект.

3) Код для конкретной платформы достигается с помощью Inversion Of Control в PCL, где, используя операторы #ifdef, вы можете достичь того же в Shared Project.

Отличную статью, которая иллюстрирует различия между PCL и Shared Project, можно найти по следующей ссылке

http://hotkrossbits.com/2015/05/03/xamarin-forms-pcl-vs-shared-project/

Венкатарамана Мадугула
источник
18

Как уже писали другие, вкратце:

совместное
повторное использование проекта на уровне кода (файла), что позволяет учитывать структуру папок и ресурсы

ПКЛ
повторное использование на уровне сборки

Что мне в большинстве случаев не хватало в ответах здесь, так это информация о сниженной функциональности, доступной в PCL: в качестве примера у вас ограничены файловые операции (мне не хватало функциональности File.IO в кроссплатформенном проекте Xamarin).

Более подробно
общий проект :
+ Может использовать #if при нацеливании на несколько платформ (например, Xamarin iOS, Android, WinPhone)
+ Все функциональные возможности фреймворка, доступные для каждого целевого проекта (хотя и должны быть скомпилированы условно)
o Интеграция во время компиляции
- немного больший размер итоговых сборок
- Требуется Visual Studio 2013 Update 2 или выше

pcl :
+ создает общую сборку
+ для использования со старыми версиями Visual Studio (обновление до 2013 года)
o динамически связанная
функциональность - lmited (подмножество всех проектов, на которые она ссылается)

Если у вас есть выбор, я бы порекомендовал пойти на общий проект, он, как правило, более гибкий и мощный. Если вы заранее знаете свои требования и PCL может выполнить их, вы также можете пойти по этому пути. PCL также обеспечивает более четкое разделение, не позволяя вам писать специфичный для платформы код (который, в первую очередь, не может быть хорошим выбором для размещения в общей сборке).

Основное внимание уделяется тому, когда вы нацеливаетесь на несколько платформ, в противном случае вы обычно используете обычный проект библиотеки / DLL.

Андреас Рейфф
источник
9

Из книги VS 2015 лаконично

Общие проекты позволяют совместно использовать код, активы и ресурсы для нескольких типов проектов. Более конкретно, следующие типы проектов могут ссылаться и использовать общие проекты:

  • Консоль, Windows Forms и Windows Presentation Foundation.
  • Приложения для Магазина Windows 8.1 и приложения для Windows Phone 8.1.
  • Приложения для Windows Phone 8.0 / 8.1 Silverlight.
  • Портативные библиотеки классов.

Примечание. - Как общие проекты, так и переносимые библиотеки классов (PCL) допускают совместное использование кода, ресурсов XAML и ресурсов, но, конечно, есть некоторые различия, которые можно обобщить следующим образом.

  • Общий проект не создает сборку многократного использования, поэтому его можно использовать только внутри решения.
  • Общий проект поддерживает код для конкретной платформы, поскольку он поддерживает переменные среды, такие как WINDOWS_PHONE_APP и WINDOWS_APP, которые вы можете использовать для определения платформы, на которой работает ваш код.
  • Наконец, общие проекты не могут зависеть от сторонних библиотек.
  • Для сравнения, PCL создает многократно используемую библиотеку .dll и может зависеть от сторонних библиотек, но не поддерживает переменные среды платформы.
Тилак
источник
7

Библиотека классов - это общий скомпилированный код.

Общий проект - это общий исходный код.

Шади Намроути
источник