Вопрос по visual-studio, .net, code-sharing – Как вы делитесь кодом между проектами / решениями в Visual Studio?

209

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

What's the best way to do it with Visual Studio 2008? Is a project present in more than one solution? Do I have a separate solution for the separate piece of code? Can a solution depend on another one?
Его 2014. Nuget - это ответ. Ravi
@Ravi Я хотел модулировать веб-приложение Visual Studio, разработанное в моем офисе. Однако, когда я пытаюсь подумать о модульном веб-приложении Visual Studio в различные веб-приложения, возникает циклическая зависимость между компонентами, которая является неправильной. Например, я не может модулировать проект POCO для каждого запланированного веб-приложения, поскольку существует слишком большая зависимость. Есть ли способ, которым я мог бы использовать Nuget, чтобы помочь с модуляризацией? CS Lewis

Ваш Ответ

16   ответов
235

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

Screengrab

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

Кроме того, ваши ссылки могут не находиться под контролем одного и того же источника. Это очень опасное предложение.
Есть ситуации, когда это решение полезно. В качестве примера я разрабатываю в InfoPath 2007, где не так просто развернуть отдельную DLL в SharePoint. Для обмена общими функциями между формами InfoPath очень полезен подход с использованием файла связанного класса. Он расположен на один уровень выше отдельных проектов форм, и все находится под контролем источника на корневом уровне.
В качестве другого примера полезности можно сказать, что вы разрабатываете два приложения, которые должны взаимодействовать друг с другом. Один из них 64-битный, а другой 32-х, так что вам не обязательно, чтобы отдельные библиотеки создавались из одного и того же кода для ссылки на каждый проект. Таким образом, вы можете имитировать функциональность c, используя файл .h.
Сладкий - вот ответ, который я искал. Я не хотел коллекцию DLL. ура
Зачем ты так поступил? Вот почему у нас есть библиотеки, инкапсуляция. Я не вижу делового или логического смысла в том, почему вы это делаете.
22

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

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

Путин:

    <Visible>false</Visible>

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

Хороший. Это выглядит как хорошее, легкое решение, если вы простите за каламбур.
Вот моя последняя версия подстановочного символа ... & lt; Compile Include = & quot; .._ Src **.& Quot; Исключить = & Quot; .._ Src \ Свойства \ AssemblyInfo.cs; .._ Src \ Bin **.; .._ Src \ OBJ **.; .._ Src *** csproj;. .._ Src *** пользователя;. .._ Src *** vstemplate & Quot;. & GT; & Lt; & Ссылка GT; Src \% (RecursiveDir)% (Имя файла)% (расширение) & л; / Ссылка & GT; & Л; / & Вкомпилировать GT;
@Cad bloke: Конечно, он работает нормально (как и ваш каламбур :), но многое нужно сказать, чтобы сделать все возможное, чтобы избежать ссылок в первую очередь.
@ChrisK Вот еще несколько разъяснений по поводу моих правок в файле csproj ...theswamp.org/index.php?topic=41850.msg472902#msg472902 , Я просто редактирую это в Notepad ++. Когда я сохраняю его, VS видит, что оно изменилось, и запрашивает перезагрузку. В VS есть настройки для управления этим поведением.
@CAD Bloke: Да, это весело. Просто для ясности я прямо скажу следующее на случай, если это кому-нибудь поможет ... Вы можете выгрузить / перезагрузить проект, чтобы он мог воспринимать изменения. (Alt-P, L дважды). Проблема VS2010 в том, что файлы .targets и т. Д.<ImportРедактируемые в .csproj файлы кэшируются, пока вы не перезагрузите решения, как вы сказали.
67

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

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

@ user2246674: почему он неполон из-за нескольких сборок? ОП ничего не сказал об одной сборке.
Этот (старый) ответ сам по себе является неполным из-за множественных сборок: однако, когдаcoupled с ILMerge - особенно с опцией internalize - это становится очень мощным решением.
Как это повлияет на рефакторинг? Если я переименую переменную в общем проекте, будут ли обновлены все решения, даже не открытые?
@Jfly: переименование вещей, которые не являются общедоступными, не повлияет на внешний код. Переименование вещей, которыеare Публичный доступ следует делать только тогда, когда все проекты, использующие общий код и сам общий код, находятся в одном решении. Вы можете вручную создать & quot; мастер & quot; решения, которые содержат все эти проекты и которые используются только для этой цели.
Нормально, но, как? Некоторые инструкции?
31

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

Это работает; с другой стороны, он не объединяет оба проекта в одну сборку.
0

Теперь вы можете использоватьShared Project

Shared Project is a great way of sharing common code across multiple application We already have experienced with the Shared Project type in Visual Studio 2013 as part of Windows 8.1 Universal App Development, But with Visual Studio 2015, it is a Standalone New Project Template; and we can use it with other types of app like Console, Desktop, Phone, Store App etc.. This types of project is extremely helpful when we want to share a common code, logic as well as components across multiple applications with in single platform. This also allows accessing the platform-specific API ’s, assets etc.

enter image description here

для дополнительной информации проверьтеэтот

4

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

Далее по этомучитать

4

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

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

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

2

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

24

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

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

Я полагаю, что это один из самых важных вопросов, который, очевидно, не получают тонны людей.
Для мерзавца вы можете использовать SubTreeSVN:externals equivalent in GIT?
Хороший. Это выглядит как хорошее, легкое решение, если вы простите за каламбур.
@ChrisK Вот еще несколько разъяснений по поводу моих правок в файле csproj ...theswamp.org/index.php?topic=41850.msg472902#msg472902 , Я просто редактирую это в Notepad ++. Когда я сохраняю его, VS видит, что оно изменилось, и запрашивает перезагрузку. В VS есть настройки для управления этим поведением.
8

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

1

Начиная с VisualStudio 2015, если вы храните весь свой код в одном решении, вы можете поделиться кодом с помощьюдобавление общего проекта. Then add a reference to this shared project for each project you want to use the code in, as well as the proper using directives.

18

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

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

Если вы хотите контролировать исходный код при каждой сборке, то вы можете иметь цель сборки, проверить библиотеки dll, скопировать из результатов сборки в папки библиотеки, а затем зарегистрировать библиотеки.
Я полагаю, что если я создам событие сборки и опубликую dll в папке _lib, управляемой исходным кодом в ссылочном проекте, то проверю, в этой ли DLL это будет работать .. кажется, что-то вроде хаки…
3

Два основных этапа включают

1- Creating a C++ dll

В визуальной студии

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** 

эта опция должна бытьDynamic Library(.dll) и построить решение / проект сейчас.

first_dll.dll файл создан вDebug folder

2- Linking it in C# project

Открытый проект 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 в проекте C ++ в VS2010 и использовал его в проекте VS2013 C #. Это работает хорошо.

5

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

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

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

Я полагаю, что это один из самых важных вопросов, который, очевидно, не получают тонны людей.
7

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

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

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

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

Просто для справки,svn:externals жесткие ссылки на хранилище. Когда вы перемещаете репозиторий, внешние ссылки все еще указывают на старый репозиторий.
При определении своих проектов обязательно используйте только относительные пути ... Это должно, особенно для многоразового использования, решить более чем крошечную проблему.
Для мерзавца вы можете использовать SubTreeSVN:externals equivalent in GIT?
4

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

Как это работает, Стевони? Не могли бы вы предоставить больше информации?
@ SteveDunn Я опубликовал практические рекомендации в своем очень редко обновляемом блоге (глупая школа и работа мешают развлечься в жизни). Можно найтиhere

Похожие вопросы