Як ви ділитеся кодом між проектами / рішеннями у Visual Studio?


229

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

  • Який найкращий спосіб зробити це за допомогою Visual Studio 2008?
  • Чи є проект більш ніж одним рішенням?
  • Чи є у мене окреме рішення для окремого фрагмента коду?
  • Чи може рішення залежати від іншого?

15
Його 2014 рік. Nuget - це відповідь.
Раві

1
@Ravi Я хотів модулювати веб-додаток Visual Studio, розроблений у моєму кабінеті. Однак, коли я намагаюся думати про модуляцію веб-програми Visual Studio у різні веб-додатки, виникає кругова залежність між компонентами, яка є неправильною. Наприклад, я не вдається модулювати проект POCO для кожного із запланованих веб-додатків, оскільки занадто велика залежність. Чи є спосіб, який я міг би використовувати Nuget, щоб допомогти з модулярізацією?
CS Льюїс

Відповіді:


70

На проект можна посилатися декількома рішеннями.

Помістіть свою бібліотеку або основний код в один проект, а потім посилайтеся на цей проект в обох рішеннях.


150
Добре, але як? Якісь інструкції?
cja

2
Ця (стара) відповідь неповна сама по собі внаслідок отримання декількох збірок: проте, в поєднанні з ILMerge - особливо з інтерналізованим варіантом - вона стає дуже потужним рішенням.
user2246674

2
@ user2246674: чому вона неповна через кілька збірок? ОП нічого не сказала про єдину асамблею.
Джон Сондерс

1
@Jfly: Перейменування речей, які не є загальнодоступними, не вплине на зовнішній код. Перейменування речей, які є загальнодоступними, слід робити лише тоді, коли всі проекти, що використовують загальний код, і сам загальний код, знаходяться в одному рішенні. Ви можете вручну створити "майстерні" рішення, які містять усі ці проекти, і які використовуються лише для цієї мети.
Джон Сондерс

1
Це залежить від того, що ви маєте на увазі під іншим випадком. Вам, мабуть, добре би почати нове запитання з ще деякими деталями.
ilivewithian

248

Ви можете "пов’язати" файл коду між двома проектами. Клацніть правою кнопкою миші проект, виберіть Add-> Existing item, а потім натисніть стрілку вниз поруч із Addкнопкою:

Screengrab

На мій досвід, зв’язування простіше, ніж створення бібліотеки. Пов'язаний код призводить до виконання одного файлу з єдиною версією.


9
Солодке - ось відповідь, яку я шукав. Я не хотів колекції DLL-файлів. ура
CAD блокується

63
Чому б ти зробив це так? Ось чому у нас є бібліотеки, інкапсуляція. Я не бачу ділового сенсу або логічного сенсу в тому, чому ти це зробиш.
Райан Терньє

16
Крім того, ваші посилання можуть не знаходитись під контролем одного джерела. Це дуже небезпечна пропозиція.
Кугель

11
Бувають ситуації, коли це рішення корисне. Як приклад, я розвиваю в InfoPath 2007, де неможливо розгорнути окрему DLL в SharePoint. Для обміну загальною функціональністю між формами InfoPath дуже корисним є підхід до файлів класу. Він розміщується на один рівень вище окремих проектів форми, і все контролюється джерелом на рівні кореня.
Олівер Грей

6
Як ще один приклад корисності говорять про те, що ви розробляєте два додатки, які потребують спілкування один з одним. Один - 64 бітний, а інший - 32, тому не обов'язково потрібно, щоб окремі DLL, побудовані з одного і того ж коду, посилалися на кожен проект. Таким чином ви можете імітувати функціональність c використанням файлу .h.
користувач912447

33

File > Add > Existing Project...дозволить додати проекти до поточного рішення. Тільки додаючи це, оскільки жоден із вищезгаданих дописів цього не вказує. Це дозволяє включати один і той же проект у декілька рішень.


1
Це справді працює; З іншого боку, це не збирає обидва проекти в одну збірку.
Ян Бойд

24

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

Я не вірю, що ви можете зробити одне рішення насправді залежним від іншого, але ви можете виконувати свої автоматизовані збірки у відповідному порядку за допомогою спеціальних сценаріїв. В основному поводьтеся зі своєю загальною бібліотекою так, ніби це була інша залежність від третьої сторони, як NUnit тощо.


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

23

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

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

Введіть:

    <Visible>false</Visible>

Якщо ви хочете приховати файли та / або запобігти розширенню підстановки, якщо ви додасте або вилучите елемент із папки "віртуально існуючий елемент", як MySisterProjectвище.


Хороший. Це виглядає як приємне, легке рішення, якщо ви помилуєте каламбур.
CAD заблокували

@ Cad bloke: Це впевнено працює добре (як і ваш каламбур :), але можна багато чого сказати, зробивши все можливе, щоб уникнути в першу чергу посилань
Рубен Бартелінк,

2
@CAD Bloke: Так, це весело. Тільки для наочності я скажу наступне явно, якщо це комусь допомагає ... Ви можете розвантажити / перезавантажити проект, щоб отримати його, щоб отримати зміни. (Alt-P, L двічі). Проблема VS2010 полягає в тому, що файли .targets і т.д. <Imported у файли .csproj кешуються, поки ви не перезавантажуєте рішення, як ви говорите.
Рубен Бартелінк

3
Ось моя остання версія підстановочної теми ... <Compile Include = ".._ Src * *. " Виключити = ".._ Src \ Властивості \ AssemblyInfo.cs; .._ Src \ bin * * .; .._ Src \ obj * * .; .._ Src ***. Csproj; .._ Src ***. Користувач; .._ Src ***. Vstemplate "> <Посилання> Src \% (RecursiveDir)% (Ім'я файлу)% (Розширення) < / Посилання> </Compile>
CAD блокується

1
@ChrisK Ось ще кілька роз'яснень щодо моїх змін у файлі csproj ... theswamp.org/index.php?topic=41850.msg472902#msg472902 . Я просто редагую його в Блокноті ++. Коли я зберігаю його, VS бачить, що він змінився, і просить перезавантажити. У VS є налаштування для контролю такої поведінки.
CAD блокується

18

Ви просто створите окремий проект бібліотеки класів, який містить загальний код. Він не повинен бути частиною жодного рішення, яке його використовує. Посилайтеся на бібліотеку класів з будь-якого проекту, який її потребує.

Єдина хитрість взагалі полягає в тому, що вам потрібно буде використовувати посилання на файл для посилання на проект, оскільки він не буде частиною рішень, які посилаються на нього. Це означає, що фактична збірка виводу повинна бути розміщена у місці, до якого може отримати доступ кожен, хто будує проект, на який посилається. Це можна зробити, наприклад, розмістивши збори на паї.


Я думаю, якщо я створять подію збірки та опублікують dll у папці _lib, керованої джерелом, у проекті посилань, то перевірте, що DLL це спрацює. Здається, це начебто хакі
тхо

1
Якщо ви хочете отримати джерело контролю над кожною збіркою, тоді ви можете мати ціль збірки, перевірити бібліотечні місця, скопіювати з виходів збірки у папки бібліотеки, а потім перевірити в dlls.
Джон Сондерс

8

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

Після років боротьби з цим я нарешті придумав дієве рішення, але воно вимагає використання Subversion для управління джерелом (що не погано)

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

Якщо я знайду ще трохи часу, я детально поясню це.


Визначаючи свої проекти, обов'язково використовуйте лише відносні шляхи ... Це, особливо для багаторазового використання, повинно вирішити більше, ніж крихітну проблему.
xtofl

5
Тільки для довідки, svn:externalsжорсткі посилання на сховище. При переміщенні сховища зовнішні посилання все ще вказують на старе сховище.
Андомар

Для git можна використовувати SubTree SVN: externals еквівалент у GIT?
Майкл Фрейджім

8

Витягніть загальний код у проект бібліотеки класів і додайте проект бібліотеки класів до своїх рішень. Потім ви можете додати посилання на загальний код з інших проектів, додавши посилання на проект на бібліотеку класів. Перевагою наявності посилання на проект на відміну від посилання на бінарний / збірний є те, що якщо ви зміните конфігурацію збірки на налагодження, випуск, користувацький тощо, проект бібліотеки загального класу також буде побудований на основі цієї конфігурації.


5

Це гарна ідея створити бібліотеку класів dll, яка містить усі загальні функціональні можливості. Кожне рішення може посилатися на цей dll самостійно незалежно від інших рішень.

Фактично, так організовані наші джерела в моїй роботі (і я вірю в багатьох інших місцях).

До речі, рішення не може прямо залежати від іншого рішення.


1
Я вважаю, що це одне з найбільших моментів питання, якого тонна людей очевидно не отримує.
Дель Лі

5

Два основні кроки - це два

1- Створення DL + C ++

У візуальній студії

New->Project->Class Library in c++ template. Name of project here is first_dll in 
visual studio 2010. Now declare your function as public in first_dll.h file and 
write the code in first_dll.cpp file as shown below.

Код файлу заголовка

// first_dll.h

using namespace System;

namespace first_dll 
{

public ref class Class1
{
public:
    static double sum(int ,int );
    // TODO: Add your methods for this class here.
};
}

Файл Cpp

//first_dll.cpp
#include "stdafx.h"

#include "first_dll.h"

namespace first_dll
{

    double Class1:: sum(int x,int y)
    {
        return x+y;
    }

 }

Перевір це

**Project-> Properties -> Configuration/General -> Configuration Type** 

ця опція повинна бути Динамічною бібліотекою (.dll) і побудувати рішення / проект зараз.

Файл first_dll.dll створюється в папці Налагодження

2- Зв’язування його у проекті C #

Відкрити проект C #

Rightclick on project name in solution explorer -> Add -> References -> Browse to path 
where first_dll.dll is created and add the file.

Додайте цей рядок вгорі в проекті C #

Using first_dll; 

Тепер до функції з DLL можна отримати доступ, використовуючи нижченаведений оператор у деякій функції

double var = Class1.sum(4,5);

Я створив проект dll in c ++ у VS2010 та використав його у проекті VS2013 C #. Він добре працює.



4

Якщо ви намагаєтеся поділити код між двома різними типами проектів (тобто: проект настільних ПК та мобільний проект), ви можете заглянути в папку спільних рішень . Я повинен зробити це для мого поточного проекту, оскільки для обох проектів для мобільних пристроїв та настільних ПК потрібні однакові класи, які є лише в 1 файлі. Якщо ви підете цим маршрутом, будь-який з проектів із пов’язаним файлом може внести зміни до нього, і всі проекти будуть перебудовані відповідно до цих змін.


Як це працює Стевоні? Чи могли б ви надати більше інформації?
Стів Данн

@SteveDunn Я опублікував практичну роботу на своєму дуже рідко оновлюваному блозі (дурна школа і робота перешкоджають цікавій справі в житті). Його можна знайти тут
Stevoni

4

Існує дуже хороший випадок використання "додавання існуючих посилань на файли" при повторному використанні коду в проектах, і саме тоді вам потрібно посилатися та підтримувати різні версії залежних бібліотек.

Зробити кілька збірок із посиланнями на різні зовнішні збірки непросто зробити інакше, не дублюючи код або використовуючи трюки з керуванням вихідного коду.

Я вважаю, що найпростіше підтримувати один проект для розробки та тестування підрозділів, а потім створювати проекти "будувати", використовуючи наявні посилання на файли, коли потрібно створити збірки, на які посилаються різні версії цих зовнішніх збірок.


2

Один простіший спосіб включити файл класу одного проекту в інші проекти - додавання проекту в існуюче рішення, а потім додавання посилання DLL нового проекту в існуючий проект. Нарешті, ви можете використовувати методи доданого класу, скасувавши, використовуючи директиву вгорі будь-якого класу.


2

Станом на VisualStudio 2015, якщо ви зберігаєте весь код в одному рішенні, ви можете поділитися кодом, додавши спільний проект . Потім додайте посилання на цей спільний проект для кожного проекту, в якому ви хочете використовувати код, а також належного використання директив.


2

Тепер ви можете використовувати Спільний проект

Спільний проект - це чудовий спосіб спільного використання спільного коду в декількох додатках. Ми вже мали досвід спільного проекту в Visual Studio 2013 як частина Windows 8.1 Universal App Development, але з Visual Studio 2015 - це окремий новий шаблон проекту; і ми можемо використовувати його з іншими типами додатків, такими як консоль, настільний ПК, телефон, магазин додатків тощо. Цей тип проекту дуже корисний, коли ми хочемо поділитися загальним кодом, логікою, а також компонентами для декількох додатків в одній платформі . Це також дозволяє отримати доступ до API, активів тощо.

введіть тут опис зображення

для отримання додаткової інформації перевірте це

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.