Как вы делитесь кодом между проектами / решениями в Visual Studio? - PullRequest
214 голосов
/ 12 июля 2009

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

  • Какой лучший способ сделать это с Visual Studio 2008?
  • Присутствует ли проект в нескольких решениях?
  • Есть ли у меня отдельное решение для отдельного куска кода?
  • Может ли решение зависеть от другого?

Ответы [ 16 ]

240 голосов
/ 01 августа 2010

Вы можете «связать» файл кода между двумя проектами. Щелкните правой кнопкой мыши свой проект, выберите Add -> Existing item, а затем нажмите стрелку вниз рядом с кнопкой Add:

Screengrab

По моему опыту, связывание проще, чем создание библиотеки. Связанный код приводит к одному исполняемому файлу с одной версией.

67 голосов
/ 12 июля 2009

На проект могут ссылаться несколько решений.

Поместите вашу библиотеку или основной код в один проект, а затем укажите этот проект в обоих решениях.

31 голосов
/ 12 июля 2009

File > Add > Existing Project... позволит вам добавлять проекты в ваше текущее решение. Просто добавляю это, так как ни один из вышеупомянутых постов не указывает на это. Это позволяет включать один и тот же проект в несколько решений.

24 голосов
/ 12 июля 2009

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

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

22 голосов
/ 05 марта 2012

Вы можете использовать подстановочные знаки, используя следующую технику (таким образом, решение @ Andomar сохраняется в .csproj)

<Compile Include="..\MySisterProject\**\*.cs">
  <Link>_Inlined\MySisterProject\%(RecursiveDir)%(Filename)%(Extension)</Link>
</Compile>

Положить в:

    <Visible>false</Visible>

Если вы хотите скрыть файлы и / или запретить расширение подстановочного знака, если вы добавляете или удаляете элемент из папки «виртуальный существующий элемент», как MySisterProject выше.

18 голосов
/ 12 июля 2009

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

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

8 голосов
/ 12 июля 2009

Извлеките общий код в проект библиотеки классов и добавьте этот проект библиотеки классов в свои решения. Затем вы можете добавить ссылку на общий код из других проектов, добавив ссылку на проект в эту библиотеку классов. Преимущество наличия ссылки на проект по сравнению с ссылкой на двоичный файл / сборку состоит в том, что если вы измените конфигурацию сборки на отладочную, выпускную, настраиваемую и т. Д., Проект библиотеки общих классов также будет построен на основе этой конфигурации.

7 голосов
/ 12 июля 2009

Вы можете включить один и тот же проект в несколько решений, но вы гарантированно столкнетесь с проблемами в будущем (относительные пути могут стать недействительными, например, при перемещении каталогов)

После многих лет борьбы с этим, я наконец-то придумал работоспособное решение, но оно требует от вас использования Subversion для управления исходным кодом (что не так уж и плохо)

На уровне каталога вашего решения добавьте свойство svn: externals , указывающее на проекты, которые вы хотите включить в свое решение. Subversion извлечет проект из хранилища и сохранит его в подпапке файла вашего решения. Ваш файл решения может просто использовать относительные пути для ссылки на ваш проект.

Если я найду больше времени, я объясню это подробно.

5 голосов
/ 03 октября 2017

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

Далее прочитано

5 голосов
/ 12 июля 2009

Хорошая идея - создать библиотеку классов dll, которая будет содержать все общие функции. Каждое решение может ссылаться на эту DLL независимо от других решений.

Фактически, так устроены наши источники в моей работе (и я верю во многих других местах).

Кстати, решение не может явно зависеть от другого решения.

...