한 C # 프로젝트의 클래스를 다른 C # 프로젝트와 함께 사용하는 방법


답변:


65

P2에서 P1에 대한 참조를 추가하기 만하면됩니다.


12
수업이 비공개이거나 P2가 P1의 친구 인 경우 작동하지 않습니다.
Manfred

7
이 경우 3 가지 옵션이 있습니다. 1) 두 프로젝트를 결합합니다. 2) 클래스를 내부로 만들고 P2를 "InternalsVisibleTo"특성으로 추가합니다 (자세한 내용은 msdn.microsoft.com/en-us/library/… ). 3) 위의 어느 것도 수행 할 수없는 경우-리플렉션을 사용하여 P2에서 클래스 P1을 인스턴스화하고 호출해야합니다
Nissim

21
나는 더 정교한 대답을 선호했을 것입니다. 이것은 거의 비꼬는 느낌입니다.
shteeven

5
예가 더 좋았을 것입니다.
Paul Alexander

1
또한 두 프로젝트 모두 동일한 .NET 프레임 워크를 대상으로해야합니다. 'Application'탭에서 각 프로젝트의 속성을 확인하십시오. 'Target framework'이 있어야합니다. 두 프로젝트 모두 여기서 동일한 프레임 워크를 대상으로해야합니다.
Travis

193
  1. '솔루션 탐색기'트리에서 P2 프로젝트를 확장 한 다음 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 메뉴에서 '참조 추가'를 선택합니다.
  2. '참조 추가'대화 상자에서 '프로젝트'탭을 선택하고 P1 프로젝트를 선택합니다.
  3. 네임 스페이스를 사용하는 경우 P2의 파일에 'using'문을 추가하여 P1 유형의 네임 스페이스를 가져와야합니다.

직접 액세스하려는 P1의 유형에는 충분한 액세스 수준이 있어야합니다. 일반적으로 이는 공개해야 함을 의미합니다.


훌륭한 조언입니다. 링크를 붙여 넣는 데 사용했지만 파일 경로를 변경할 때마다 업데이트해야했습니다. 프로젝트 참조를 사용하면 모든 것이 훨씬 쉬워집니다. 감사합니다!
IneedHelp

2
P1에 P2에 대한 참조가 이미있는 경우 어떻게합니까? 위의 작업을 수행하면 "순환 종속성"이 생성됩니다 ...
colmde

4
@colmde 그렇습니다. 공유하려는 요소를 세 번째 프로젝트로 추상화해야합니다. 다른 두 프로젝트에서 참조하는 P3라는 제목을 상상할 수 있습니다.
폴 Ruane

비 NET 개발자로서 저는 이것이 받아 들여진 대답이어야한다고 생각합니다. Paul (x2)
thisIsTheFoxe

16

Paul Ruane이 맞습니다. 방금 프로젝트를 구축해 보았습니다. 나는 그것이 작동하는지 테스트하기 위해 전체 SLN을 만들었습니다.

VC # VS2008에서 만들었습니다.

<< (() 주석으로 이것을 읽는 다른 사람들을 돕는 것)

1 단계:

DoubleProject라는 솔루션 만들기

2 단계:

DoubleProjectTwo라는 솔루션에서 프로젝트 만들기 (이렇게하려면 솔루션 파일을 선택하고 마우스 오른쪽 단추로 클릭-> 추가-> 새 프로젝트)

이제 동일한 솔루션에 두 개의 프로젝트가 있습니다.

Step3 :

Paul Ruane이 말했듯이. 솔루션 탐색기의 참조로 이동합니다 (닫힌 경우 컴파일러의보기 탭에 있음). DoubleProjectTwo는 DoubleProject의 기능 / 메소드가 필요한 것이므로 DoubleProjectTwo에서 오른쪽 마우스 참조-> Add-> Projects-> DoubleProject.

Step4 :

네임 스페이스에 대한 지시문을 포함하십시오.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DoubleProject; <------------------------------------------

namespace DoubleProjectTwo
{
    class ClassB
    {
        public string textB = "I am in Class B Project Two";
        ClassA classA = new ClassA();


        public void read()
        {
            textB = classA.read();
        }
    }
}

Step5 :

결과에 대한 증거를 보여줍니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DoubleProject
{
    public class ClassA    //<---------- PUBLIC class
    {
        private const string textA = "I am in Class A Project One";

        public string read()
        {
            return textA;
        }
    }
}

메인

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DoubleProjectTwo;  //<----- to use ClassB in the main

namespace DoubleProject
{
    class Program
    {
        static void Main(string[] args)
        {
            ClassB foo = new ClassB();

            Console.WriteLine(foo.textB);
            Console.ReadLine();
        }
    }
}

트릭을해야합니다.

도움이 되었기를 바랍니다

편집 ::: 웁스 실제로 문자열을 변경하는 메서드 호출을 잊어 버렸습니다. 동일한 작업을 수행하지 마십시오. :)


9

너무 자주 새로운 개발자는 Visual Studio IDE의 일반적인 문제인이 간단한 질문을합니다. 특정 질문에 대답하는 사람은 거의 없으며 자주 질문을 비판하거나 일반적인 문제에 대답하지 않는 해결책을 "추측"합니다. 첫 번째 일반적인 문제는 IDE가 프로젝트 이름을 변경하지 않는 한 기존 솔루션 (기본적으로 새 솔루션을 생성 함)에 새 파일 (.java, .py, .cpp, .c)을 추가하는 대신 새 프로젝트를 생성하도록 유도한다는 것입니다. 현재 솔루션에 추가하십시오. 이 문제는 Python, Java, C #, C ++ 및 C 프로젝트 폴더에서 발생합니다.

이것은 IDE의 new> project> project 유형 명령을 사용하여 다른 프로젝트를 추가 할 때 발생하지 않습니다. 여기서 문제는 새 프로젝트가 기존 클라이언트 또는 사용자 인터페이스 코드 파일과 다른 디렉토리에 저장된다는 것입니다. 새 프로젝트가 아닌 동일한 프로젝트 공간에 새 "파일"을 만들려면 초보자는 Microsoft가 수행하지 않는 다음 작업을 수행해야하며 기본적으로 직관적으로 명백한 것에서 멀어지게합니다.

  1. 새 비헤이비어를 가져올 "응용 프로그램"을 선택합니다 (다른 파일에서).
  2. 프로젝트 선택> 새 항목 추가
  3. filetype.py, filetype.java, filetype.c, filetype.cpp, filetype.C # 등과 같은 "프로그램 파일 템플릿 유형"또는 라이브러리 클래스 파일 유형 (생성 할 때 표시되는 시작 파일 옵션 이외의 것)을 선택합니다. 새 응용 프로그램 프로젝트 또는 새 라이브러리 프로젝트 만들기).
  4. 기본 이름을 가진 새 파일 이름이 프로젝트에 생성됩니다.
  5. 파일의 기본 이름을 library.py 또는 façade.java 등으로 변경하십시오.

이제 라이브러리를 가져 오거나 네임 스페이스를 사용하기위한 코드 권장 사항이 위의 설명에 설명 된대로 작동하며 Microsoft에서 쉽게 변경할 수없는 경로 문을 변경하거나 솔루션 경로 및 솔루션 이름을 변경할 필요가 없습니다 (즉, 파일 이름 또는 프로젝트 이름이지만 IDE는 프로젝트 경로 또는 솔루션 경로 이름을 자동으로 변경하지 않습니다.

다음은 Python 예제이지만 포함, 네임 스페이스를 사용하거나 각 언어에 적합한 코드 명령을 사용하여 동일한 디렉토리 공간의 다른 클래스 / 프로젝트에서 코드를 찾기 위해 C #, Java 또는 C / C ++에서 유사하게 작동합니다.

동일한 디렉토리의 다른 코드 파일에서 가져 오는 응용 프로그램 파일 "hello world"입니다.

이 stackoverflow 주석 편집기에서 파이썬 공백 구분 기호가 올바르게 공백이되지 않습니다.

print ("test")

from CIXMPythonFacade import ClassA

c1=ClassA
c1.methodA()

from CIXMPythonFacade import functionA 

functionA()


class ClassName(object): 
         def __init__(object, parameter):
         object.parameter = value

가져올 클래스, 메서드 또는 함수가 포함 된 라이브러리 파일 또는 "façade"파일입니다.

class class1(object):
    """description of class"""

class ClassA(object):
    print ("test2")
    def methodA():
        print ("test3")

def functionA ():
    print ("test4")
    return (0)


pass

이제 IDE가 당신을 이끄는 혼란을 실제로 어떻게 해결합니까? 동일한 디렉토리 공간에있는 다른 파일에서 코드를 가져 오려면 해당 파일에 대한 참조를 추가합니다.

  1. 응용 프로그램 파일 선택
  2. 프로젝트> 참조 추가를 선택하십시오.
  3. 올바른 디렉토리 경로로 보이는 파일 이름을 선택하십시오 (확인하십시오).
  4. 이제 인터프리터, 코드 검사기 및 / 또는 컴파일러에서 참조를 사용할 수 있습니다.

이제이 문제가 해결되었으므로 동일한 솔루션 공간에서 두 개의 개별 프로젝트를 실제로 연결하는 방법은 무엇입니까?

  1. 인덱서 또는 "인텔리 센스"옵션과 컴파일러 / 인터프리터로 이동하여 "두 번째"프로젝트 또는 솔루션 공간을 가리키는 것이 아닌 경우 디렉터리 경로 문을 물리적으로 확인하거나 변경 / 추가해야합니다. 경로를 변경하거나 경로 변수를 작업 공간과 다른 디렉토리 공간 인 프로젝트의 특정 위치로 변경하면 컴파일러와 코드 분석기가 이러한 라이브러리, headers.h, 네임 스페이스, 프로젝트 또는 파일 위치를 찾을 수 있습니다.
  2. 실수로 만든 오래된 프로젝트를 제거하는 것은 더 나쁩니다. Visual Studio IDE를 종료하고 Windows 탐색기를 열고 작업 공간 디렉토리로 이동합니다. ... documents \ visualstudio xxx \ solutionname \ packagename 파일 또는 폴더를 선택하고 마우스 오른쪽 버튼을 클릭하여 파일 또는 폴더를 "삭제"합니다.
  3. IDE에 다시 들어가서 열린 솔루션 또는 열린 패키지 / 솔루션을 선택하면 이전 파일과 솔루션 / 패키지 이름이 잘못된 경로 문처럼 사라져 컴파일러와 코드 분석기가 변경하더라도 이전 디렉토리를 보도록 속입니다. 파일 이름을 변경하고 프로젝트 이름을 변경하더라도 디렉토리 경로는 변경되지 않습니다.

Microsoft는 실제로 이러한 문제를 해결해야하므로 대부분의 사람들이 동일한 디렉토리에 새 파일로 만들고자하는 것을 직관적으로 만들고 솔루션을 선택하고 IDE에서 삭제하여 제거 할 수 있습니다. 초보자는 노련한 개발자에게는 매우 유연하지만 기본적으로 새로운 개발자에게는 불공평 한 디렉토리 경로 문에 매우 실망합니다.

이것이 정말 새로운 사람들에게 도움이되고 노련한 개발자들이 당신에게 맞지 않는 잘못된 대답을주는 것을 막기를 바랍니다. 그들은 이미 경로 문을 이해하고 올바른 코드를 입력하기를 원한다고 가정합니다. 이것이 코드를 수정하려고 시도 할 때 터널이 들어오는 이유이지만 문제를 해결하는 데 도움이되지 않습니다. 이것은 아마도 새로운 프로그래머에게는 작동하지 않는 잘못된 답변으로 stackoverflow에서 지속적으로 설명되는 가장 일반적인 문제 일 것입니다.


이 답변을 요약하려면 (VS 2017의 경우) : 솔루션 탐색기에서 P1을 마우스 오른쪽 단추로 클릭 >>> 추가 ... >>> 참조 ... >>> 프로젝트 >>> 솔루션 >>> P2 확인란을 선택합니다.
앤드류 페이트

7

첫 번째 단계는 다음을 수행하여 P2 참조 P1을 만드는 것입니다.

  • 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 "참조 추가"를 선택합니다.
  • 프로젝트 탭으로 이동
  • P1을 선택하고 확인을 누르십시오.

다음으로 P1의 클래스가 P2에 액세스 할 수 있는지 확인해야합니다. 가장 쉬운 방법은 그들을 만드는 것 public입니다.

public class MyType { ... }

이제 정규화 된 이름을 통해 P2에서 사용할 수 있습니다. P1의 네임 스페이스가 Project1이라고 가정하면 다음이 작동합니다.

Project1.MyType obj = new Project1.MyType();

하지만 선호하는 방법은 using for를 추가하여 Project1자격없이 유형을 사용할 수 있도록하는 것입니다.

using Project1;
...

public void Example() {
  MyType obj = new MyType();
}

5

하나의 솔루션 폴더에 두 개의 프로젝트가있는 경우 네임 스페이스를 사용하여 다른 프로젝트에 참조를 추가하기 만하면 클래스를 가져올 수 있습니다. requried 클래스에 대한 객체를 만드는 동안. 원하는 방법을 호출하십시오.

FirstProject :

class FirstClass()
{
   public string Name()
   {
      return "James";
   }
}

여기에 두 번째 프로젝트에 대한 참조를 추가하십시오.

SecondProject :

class SeccondClass
{
    FirstProject.FirstClass obj=new FirstProject.FirstClass();
    obj.Name();
}

4

프로젝트 P1에서 클래스를 공개합니다 (아직 공개하지 않은 경우). 그런 다음 P2에 프로젝트 참조를 추가합니다 (파일 참조가 아니라 가끔 실수로 보았습니다). P2의 올바른 위치에 using 문을 추가하고 P1의 클래스 사용을 시작합니다.

(이것을 언급하자면 : 클래스를 공개하는 대안은 P2를 P1의 친구로 만드는 것입니다. 그러나 이것은 약간의 결과를 초래할 수 있기 때문에 당신이 원하는 대답이 아닐 것입니다. 따라서 위의 제안을 고수하십시오.)


2

프로젝트 2의 클래스가 MyClass라고 가정합니다.

분명히, 먼저 프로젝트 1의 참조 아래에서 프로젝트 2를 참조한 다음

using namespaceOfProject2;

// for the class calling bit:

namespaceOfProject2.MyClass project2Class = new namespaceOfProject2.MyClass();

따라서 해당 클래스를 참조 할 때마다 project2Class를 입력합니다. 또한 수업이 공개되어 있는지 확인하십시오.


1

다른 대상 프레임 워크에 문제가 있습니다.

나는 모든 것을 올바르게하고 있었지만 P2에서 참조를 사용할 수 없었습니다. P1과 P2에 대해 동일한 대상 프레임 워크를 설정 한 후 매력처럼 작동했습니다.

누군가를 도울 수 있기를 바랍니다.


The name ... does not exist in the current context. Cannot resolve symbol ...프로젝트의 대상 프레임 워크를 일치시킬 때까지 같은 오류가 발생하여 동일한 문제가 발생했습니다 . (프로젝트를 마우스 오른쪽 버튼으로 클릭하고 Project -> Properties -> Target framework변경하려면 이동 하십시오.)
sonny
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.