Visual Studio에서 프로젝트 / 솔루션간에 코드를 어떻게 공유합니까?


229

공통 코드가있는 두 가지 솔루션이 있으므로 추출하여 서로 공유하고 싶습니다. 또한 다른 사람들에게 유용 할 수 있기 때문에 해당 라이브러리를 독립적으로 릴리스 할 수 있기를 원합니다.

  • Visual Studio 2008을 사용하는 가장 좋은 방법은 무엇입니까?
  • 프로젝트가 둘 이상의 솔루션에 있습니까?
  • 별도의 코드 조각에 대한 별도의 솔루션이 있습니까?
  • 솔루션이 다른 솔루션에 의존 할 수 있습니까?

15
Nuget이 그 해답입니다.
Ravi

1
@Ravi 사무실에서 개발 한 Visual Studio 웹 응용 프로그램을 모듈화하고 싶었지만 Visual Studio 웹 응용 프로그램을 다른 웹 응용 프로그램으로 모듈화하려고 할 때 구성 요소 간의 순환 종속성이 발생합니다. 종속성이 너무 많으므로 계획된 각 웹 애플리케이션마다 POCO 프로젝트를 모듈화 할 수 없습니다. Nuget을 사용하여 모듈화를 도울 수있는 방법이 있습니까?
CS Lewis

답변:


70

여러 솔루션으로 프로젝트를 참조 할 수 있습니다.

라이브러리 또는 핵심 코드를 하나의 프로젝트에 넣은 다음 두 솔루션 모두에서 해당 프로젝트를 참조하십시오.


150
그래도 어떻게? 몇 가지 지침?
cja

2
이 (구) 대답으로 인해 여러 어셈블리의 결과로 불완전 자체이다 : 그러나, 결합 - 특히 내면화 옵션 - ILMerge으로 매우 강력한 솔루션이된다.
user2246674

2
@ user2246674 : 여러 어셈블리로 인해 왜 불완전합니까? OP는 단일 어셈블리에 대해서는 아무 말도하지 않았다.
존 손더스

1
@Jfly : 공개적으로 보이지 않는 것들의 이름을 바꾸더라도 외부 코드에는 영향을 미치지 않습니다. 사물의 이름을 변경 있습니다 일반적인 코드 및 공통 코드 자체를 사용하는 모든 프로젝트를 하나의 솔루션에있는 경우에만 수행해야 공개적으로 표시합니다. 이러한 모든 프로젝트를 포함하고이 목적으로 만 사용되는 "마스터"솔루션을 수동으로 작성할 수 있습니다.
John Saunders

1
다른 인스턴스의 의미에 따라 다릅니다. 더 자세한 내용으로 새로운 질문을 시작하는 것이 좋습니다.
ilivewithian

248

두 프로젝트간에 코드 파일을 "링크"할 수 있습니다. 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 Add-> Existing item를 선택한 다음 Add버튼 옆의 아래쪽 화살표를 클릭하십시오 .

스크린 그랩

내 경험상 연결은 라이브러리를 만드는 것보다 간단합니다. 링크 된 코드는 단일 버전의 단일 실행 파일을 생성합니다.


9
Sweet-그게 내가 찾던 답이다. DLL 컬렉션을 원하지 않았습니다. 건배
CAD bloke

63
왜 이런 식으로 하시겠습니까? 이것이 우리가 라이브러리, 캡슐화를 갖는 이유입니다. 나는 왜 당신이 이것을 할 것인지에 대한 비즈니스 감각이나 논리적 의미를 보지 못합니다.
Ryan Ternier

16
또한 링크가 동일한 소스 제어하에 있지 않을 수 있습니다. 이것은 매우 위험한 제안입니다.
Kugel

11
이 솔루션이 유용한 상황이 있습니다. 예를 들어 InfoPath 2007에서 SharePoint에 별도의 DLL을 배포하는 것이 쉽지 않은 경우를 개발하고 있습니다. InfoPath 양식간에 공통 기능을 공유하려면 연결된 클래스 파일 접근 방식이 매우 유용합니다. 개별 폼 프로젝트보다 한 레벨 위에 있으며 모든 것은 루트 레벨에서 소스 제어됩니다.
Oliver Gray

6
유용한 또 다른 예로, 서로 통신해야하는 두 개의 응용 프로그램을 개발 중이라고합니다. 하나는 64 비트이고 다른 하나는 32이므로 각 프로젝트를 참조하기 위해 동일한 코드로 작성된 별도의 dll이 필요하지는 않습니다. 이런 식으로 .h 파일 사용의 c 기능을 모방 할 수 있습니다.
user912447

33

File > Add > Existing Project...현재 솔루션에 프로젝트를 추가 할 수 있습니다. 위의 게시물 중 어느 것도 지적하지 않기 때문에 이것을 추가하면됩니다. 이를 통해 여러 솔루션에 동일한 프로젝트를 포함시킬 수 있습니다.


1
이것은 작동합니다. 단점은 두 프로젝트를 하나의 어셈블리로 빌드하지는 않는다는 것입니다.
Ian Boyd

24

둘 이상의 솔루션에 프로젝트를 포함 있습니다 . 프로젝트에 어떤 솔루션이 포함되어 있는지에 대한 개념이 없다고 생각합니다. 그러나 또 다른 대안은 첫 번째 솔루션을 잘 알려진 위치에 빌드하고 컴파일 된 바이너리를 참조하는 것입니다. 릴리스 또는 디버그 구성에서 빌드 중인지 여부에 따라 다른 버전을 참조하려는 경우 약간의 작업이 필요하다는 단점이 있습니다.

하나의 솔루션이 실제로 다른 솔루션에 의존하게 만들 수는 없지만 사용자 정의 스크립트를 통해 적절한 순서로 자동화 된 빌드를 수행 할 수 있다고 생각합니다. 기본적으로 공용 라이브러리는 NUnit 등과 같은 다른 타사 종속성 인 것처럼 취급합니다.


이 프로젝트는 너겟 패키지가 저장되는 위치를 추적하며 솔루션을 열어 변경하면 빌드 시간에 두통을 유발할 수 있으므로 바람직한 솔루션입니다.
Shane Courtrille

23

다음 기술을 사용하여 인라인 와일드 카드를 사용할 수 있습니다 (@Andomar의 솔루션이 .csproj에 저장되는 방식입니다)

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

넣다 :

    <Visible>false</Visible>

MySisterProject위와 같이 '가상 기존 항목'폴더에서 항목을 추가하거나 제거하면 파일을 숨기거나 와일드 카드 포함이 확장되지 않도록하려면 .


좋은데 당신이 말장난을 용서한다면, 이것은 훌륭하고 가벼운 솔루션처럼 보입니다.
CAD bloke

@Cad bloke : 확실히 괜찮아요 (당신의 말장난처럼) : 그러나 처음부터 링크를 피하기 위해 최선을 다해야 할 말이 많이 있습니다.
Ruben Bartelink

2
@CAD Bloke : 그렇습니다. 재미 있습니다. 명확히하기 위해 누군가에게 도움이 될 경우를 대비하여 다음을 명시 적으로 말하겠습니다 ... 프로젝트를 언로드 / 다시로드하여 변경 사항을 적용 할 수 있습니다. (Alt-P, L 두 번). VS2010 문제는 <Import솔루션을 다시로드 할 때까지 .csproj 파일에 .targets 파일 등 이 캐시 된다는 것입니다.
Ruben Bartelink

3
다음은 와일드 카드 테마의 최신 버전입니다 ... <Compile Include = ".._ Src * *. "Exclude = ".._ Src \ Properties \ AssemblyInfo.cs; .._ Src \ bin * * .; .._ Src \ obj * * .; .._ Src ***. csproj; .._ Src ***. user; .._ Src ***. vstemplate "> <링크> Src \ % (RecursiveDir) % (파일 이름) % (확장) < / Link> </ Compile>
CAD 블로킹

1
@ChrisK 다음은 csproj 파일 인 theswamp.org/index.php?topic=41850.msg472902#msg472902의 편집 내용에 대한 설명입니다 . 메모장 ++에서 편집했습니다. VS를 저장하면 변경 된 것을보고 다시로드를 요청합니다. VS에는이 동작을 제어하기위한 설정이 있습니다.
CAD bloke

18

공통 코드를 포함 할 별도의 클래스 라이브러리 프로젝트를 작성하기 만하면됩니다. 이를 사용하는 솔루션의 일부일 필요는 없습니다. 필요한 모든 프로젝트에서 클래스 라이브러리를 참조하십시오.

유일한 트릭은 프로젝트를 참조하는 솔루션의 일부가 아니기 때문에 프로젝트를 참조하기 위해 파일 참조를 사용해야한다는 것입니다. 즉, 실제 출력 어셈블리는이를 참조하는 프로젝트를 작성하는 모든 사람이 액세스 할 수있는 위치에 배치해야합니다. 예를 들어 어셈블리를 공유에 배치하면됩니다.


내가 빌드 이벤트를 만든 다음 DLL이 작동 것이라고 체크인, 참조하는 프로젝트의 소스 제어 _lib 폴더에 DLL을 게시하는 경우 나는 ... 종류 해키 상점의 것 .. 생각
hanzolo

1
모든 빌드를 소스 제어하려면 빌드 대상이 라이브러리 dll을 체크 아웃하고 빌드 출력에서 ​​라이브러리 폴더로 복사 한 다음 dll을 체크인 할 수 있습니다.
John Saunders

8

둘 이상의 솔루션에 동일한 프로젝트를 포함시킬 수 있지만 언젠가는 문제가 발생할 수 있습니다 (예 : 디렉토리를 이동할 때 상대 경로가 유효하지 않을 수 있음)

수년간의 어려움을 겪은 후에 마침내 실행 가능한 솔루션을 찾았지만 소스 제어를 위해 Subversion을 사용해야합니다 (나쁜 것은 아닙니다)

솔루션의 디렉토리 레벨에서 솔루션 에 포함하려는 프로젝트를 가리키는 svn : externals 특성을 추가 하십시오. Subversion은 저장소에서 프로젝트를 가져 와서 솔루션 파일의 하위 폴더에 저장합니다. 솔루션 파일은 단순히 상대 경로를 사용하여 프로젝트를 참조 할 수 있습니다.

시간이 더 있으면 자세히 설명하겠습니다.


프로젝트를 정의 할 때는 상대 경로 만 사용해야합니다. 특히 재사용 가능한 경로의 경우 작은 문제 이상을 해결해야합니다.
xtofl

5
참조 용으로, svn:externals저장소 에 대한 하드 링크. 저장소를 이동해도 외부 링크는 여전히 이전 저장소를 가리 킵니다.
Andomar

git의 경우 GIT에서
Michael Freidgeim

8

공통 코드를 클래스 라이브러리 프로젝트로 추출하고 해당 클래스 라이브러리 프로젝트를 솔루션에 추가하십시오. 그런 다음 해당 클래스 라이브러리에 프로젝트 참조를 추가하여 다른 프로젝트의 공통 코드에 대한 참조를 추가 할 수 있습니다. 바이너리 / 어셈블리 참조와 반대로 프로젝트 참조를 사용하면 빌드 구성을 디버그, 릴리스, 사용자 정의 등으로 변경하면 공통 클래스 라이브러리 프로젝트도 해당 구성을 기반으로 빌드됩니다.


5

모든 공통 기능을 포함하는 dll 클래스 라이브러리를 작성하는 것이 좋습니다. 각 솔루션은 다른 솔루션에 관계없이이 dll을 독립적으로 참조 할 수 있습니다.

사실, 이것은 우리의 소스가 내 작업에서 구성되는 방식입니다 (그리고 나는 다른 많은 장소를 믿습니다).

그건 그렇고, 솔루션은 다른 솔루션에 명시 적으로 의존 할 수 없습니다.


1
나는 이것이 많은 사람들이 분명히 얻지 못하는 질문의 가장 큰 요점 중 하나라고 생각합니다.
델 리

5

관련된 두 가지 주요 단계는

1- 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 파일이 디버그 폴더에 생성됩니다

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);

VS2010의 C ++ 프로젝트에서 dll을 만들고 VS2013 C # 프로젝트에서 사용했습니다.



4

서로 다른 두 가지 프로젝트 유형 (예 : 데스크톱 프로젝트와 모바일 프로젝트)간에 코드를 공유하려는 경우 공유 솔루션 폴더를 살펴볼 수 있습니다 . 모바일 프로젝트와 데스크톱 프로젝트 모두 하나의 파일에있는 동일한 클래스가 필요하므로 현재 프로젝트 에서이 작업을 수행해야합니다. 이 경로로 이동하면 파일이 연결된 프로젝트가 해당 경로를 변경할 수 있으며 모든 프로젝트가 해당 변경 사항에 따라 다시 작성됩니다.


Stevoni는 어떻게 작동합니까? 더 많은 정보를 제공해 주시겠습니까?
Steve Dunn

@SteveDunn 나는 매우 드물게 업데이트 된 블로그 (어리석은 학교와 직장에서 재미있는 일을 방해하는 방법)를 게시했습니다. 여기
Stevoni

4

프로젝트 전체에서 코드를 재사용 할 때 "기존 파일 링크 추가"를 사용하는 경우가 매우 좋습니다. 이는 서로 다른 버전의 종속 라이브러리를 참조하고 지원해야하는 경우입니다.

다른 외부 어셈블리를 참조하여 여러 어셈블리를 만드는 것은 코드를 복제하거나 소스 코드 컨트롤을 사용하여 트릭을 사용하지 않으면 쉽게 수행 할 수 없습니다.

개발 및 단위 테스트를 위해 하나의 프로젝트를 유지 관리하고 외부 파일의 다른 버전을 참조하는 어셈블리를 만들어야 할 때 기존 파일 링크를 사용하여 '빌드'프로젝트를 만드는 것이 가장 쉽다고 생각합니다.


2

한 프로젝트의 클래스 파일을 다른 프로젝트에 포함시키는 한 가지 간단한 방법은 기존 솔루션에 프로젝트를 추가 한 다음 기존 프로젝트에서 새 프로젝트의 DLL 참조를 추가하는 것입니다. 마지막으로 모든 클래스의 맨 위에 지시문을 사용하여 추가 된 클래스의 메서드를 사용할 수 있습니다.


2

VisualStudio 2015부터 모든 코드를 하나의 솔루션으로 유지 하면 공유 프로젝트추가하여 코드를 공유 할 수 있습니다 . 그런 다음 코드를 사용하려는 각 프로젝트에 대한이 공유 프로젝트에 대한 참조와 올바른 사용 지시문을 추가하십시오.


2

이제 공유 프로젝트를 사용할 수 있습니다

공유 프로젝트는 여러 응용 프로그램에서 공통 코드를 공유하는 좋은 방법입니다. 우리는 이미 Windows 8.1 Universal App Development의 일부로 Visual Studio 2013의 공유 프로젝트 유형에 대해 경험했지만 Visual Studio 2015에서는 독립형 새 프로젝트 템플릿입니다. Console, Desktop, Phone, Store App 등과 같은 다른 유형의 응용 프로그램과 함께 사용할 수 있습니다.이 유형의 프로젝트는 단일 코드에서 여러 응용 프로그램간에 공통 코드, 논리 및 구성 요소를 공유하려는 경우 매우 유용합니다. . 또한 플랫폼 별 API, 자산 등에 액세스 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

자세한 내용은 이것을 확인 하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.