วิธีใช้คลาสจากโปรเจ็กต์ C # หนึ่งกับโปรเจ็กต์ C # อื่น


คำตอบ:


65

เพียงเพิ่มการอ้างอิงถึง P1 จาก P2


12
สิ่งนี้จะไม่ได้ผลหากชั้นเรียนไม่เป็นสาธารณะหรือถ้า P2 เป็นเพื่อนกับ P1
Manfred

7
ในกรณีนี้คุณมี 3 ตัวเลือก: 1) รวม 2 โปรเจ็กต์ 2) ทำให้คลาสเป็นแบบภายใน - และเพิ่ม P2 เป็นแอตทริบิวต์ "InternalsVisibleTo" (ข้อมูลเพิ่มเติมที่นี่: msdn.microsoft.com/en-us/library/… ) 3) หากไม่สามารถทำได้ข้างต้น - คุณจะต้องใช้การสะท้อนเพื่อสร้างอินสแตนซ์และเรียกคลาส P1 จาก P2
Nissim

21
ฉันต้องการคำตอบที่ละเอียดกว่านี้ อันนี้รู้สึกเกือบจะประชดประชัน
shteeven

5
ตัวอย่างจะดีกว่า
Paul Alexander

1
นอกจากนี้ทั้งสองโครงการต้องกำหนดเป้าหมายกรอบงาน. NET เดียวกัน ตรวจสอบคุณสมบัติของแต่ละโครงการในแท็บ "แอปพลิเคชัน" ควรมี "กรอบเป้าหมาย" ทั้งสองโครงการต้องกำหนดเป้าหมายกรอบเดียวกันที่นี่
Travis

195
  1. ในโครงสร้าง 'โซลูชัน Explorer' ขยายโครงการ P2 จากนั้นคลิกขวาที่โครงการและเลือก 'เพิ่มการอ้างอิง' จากเมนู
  2. ในกล่องโต้ตอบ "เพิ่มการอ้างอิง" เลือกแท็บ "โครงการ" และเลือกโครงการ P1 ของคุณ
  3. หากคุณใช้เนมสเปซคุณจะต้องนำเข้าเนมสเปซสำหรับประเภท P1 ของคุณโดยเพิ่มคำสั่ง 'ใช้' ลงในไฟล์ของคุณใน P2

โปรดทราบว่าประเภทใน P1 ที่คุณต้องการเข้าถึงโดยตรงจะต้องมีระดับการเข้าถึงที่เพียงพอ: โดยทั่วไปหมายความว่าต้องเปิดเผยต่อสาธารณะ


คำแนะนำที่ยอดเยี่ยมครับ ฉันเคยวางลิงก์ แต่หลังจากนั้นฉันก็ต้องอัปเดตทุกครั้งที่เปลี่ยนเส้นทางของไฟล์ ด้วยการอ้างอิงโครงการทั้งหมดนั้นง่ายกว่ามาก ขอบคุณ!
IneedHelp

2
จะเกิดอะไรขึ้นถ้าคุณมีการอ้างอิงถึง P2 ใน P1 อยู่แล้ว? การทำข้างต้นจะทำให้เกิด "การพึ่งพาแบบวงกลม" ...
colmde

4
@colmde ใช่มันจะ. คุณจะต้องสรุปองค์ประกอบที่คุณต้องการแชร์ในโปรเจ็กต์ที่สามซึ่งคุณสามารถจินตนาการได้ว่าชื่อ P3 ซึ่งอ้างอิงโดยอีกสองโปรเจ็กต์
Paul Ruane

ในฐานะนักพัฒนาที่ไม่ใช่ NET ฉันคิดว่านี่น่าจะเป็นคำตอบที่ยอมรับจริงๆ ... ขอบคุณ Paul (x2)
thisIsTheFoxe

16

พอเรือนถูกต้องฉันเพิ่งลองสร้างโครงการด้วยตัวเอง ฉันเพิ่งสร้าง SLN ทั้งหมดเพื่อทดสอบว่าทำงานได้หรือไม่

ฉันทำสิ่งนี้ใน VC # VS2008

<< (เพียงแค่ช่วยคนอื่น ๆ ที่อ่านสิ่งนี้ด้วย () ความคิดเห็น)

ขั้นตอนที่ 1:

สร้างโซลูชันที่เรียกว่า DoubleProject

ขั้นตอนที่ 2:

สร้างโครงการในโซลูชันชื่อ DoubleProjectTwo (ในการดำเนินการนี้เลือกไฟล์โซลูชันคลิกขวา -> เพิ่ม -> โครงการใหม่)

ตอนนี้ฉันมีสองโครงการในโซลูชันเดียวกัน

ขั้นที่ 3:

ตามที่ Paul Ruane ระบุไว้ ไปที่การอ้างอิงในตัวสำรวจโซลูชัน (หากปิดจะอยู่ในแท็บมุมมองของคอมไพเลอร์) DoubleProjectTwo เป็นฟังก์ชันที่ต้องการฟังก์ชัน / วิธีการของ DoubleProject ดังนั้นในการอ้างอิงเมาส์ขวาของ DoubleProjectTwo ที่นั่น -> เพิ่ม -> โครงการ -> DoubleProject

ขั้นตอนที่ 4:

รวมคำสั่งสำหรับเนมสเปซ:

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

ขั้นที่ 5:

ทำให้บางสิ่งบางอย่างแสดงหลักฐานผลลัพธ์:

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

สิ่งนี้จะไม่เกิดขึ้นเมื่อคุณเพิ่มโปรเจ็กต์อื่นโดยใช้คำสั่ง> project> project type ใหม่ของ IDE ปัญหาที่นี่คือโปรเจ็กต์ใหม่ถูกเก็บไว้ในไดเร็กทอรีอื่นนอกเหนือจากไฟล์โค้ด Client หรือ User interface ที่มีอยู่ ในการสร้าง "ไฟล์" ใหม่ในพื้นที่โปรเจ็กต์เดิมแทนที่จะเป็นโปรเจ็กต์ใหม่ผู้เริ่มต้นจะต้องทำสิ่งต่อไปนี้เพื่อที่ 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 ++ โดยใช้คำสั่ง include, namespaces หรือใช้รหัสที่เหมาะสมกับแต่ละภาษาเพื่อค้นหาโค้ดในคลาส / โปรเจ็กต์อื่น ๆ ใน DIRECTORY SPACE เดียวกัน

ไฟล์แอปพลิเคชัน "hello world" นำเข้าจากไฟล์รหัสอื่นในไดเรกทอรีเดียวกัน

โปรดสังเกตว่าตัวคั่นช่องว่างสีขาวของ python จะไม่เว้นวรรคอย่างถูกต้องในตัวแก้ไขความคิดเห็น 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. คุณต้องไปที่ทั้งตัวทำดัชนีหรือตัวเลือก "intellisense" และคอมไพเลอร์ / ล่ามและตรวจสอบหรือเปลี่ยนแปลง / เพิ่มคำสั่งเส้นทางไดเร็กทอรีหากเป็นสิ่งอื่นที่ชี้ไปยังโครงการ "ที่สอง" หรือพื้นที่โซลูชันของคุณ เมื่อคุณทำการเปลี่ยนแปลงเส้นทางหรือเปลี่ยนตัวแปรพา ธ ไปยังพื้นที่ทำงานของคุณและตำแหน่งเฉพาะของโปรเจ็กต์ซึ่งเป็นพื้นที่ไดเร็กทอรีที่แตกต่างกันคอมไพลเลอร์และตัววิเคราะห์โค้ดจะสามารถค้นหาไลบรารี headers.h เนมสเปซโปรเจ็กต์หรือตำแหน่งไฟล์เหล่านี้ได้
  2. หากต้องการลบโครงการเก่าที่คุณสร้างขึ้นโดยไม่ได้ตั้งใจจะยิ่งแย่ลงไปอีก คุณต้องออกจาก Visual Studio IDE เปิด windows explorer ไปที่ไดเร็กทอรีพื้นที่ทำงาน ... document \ visualstudio xxx \ solutionname \ packagename เลือกไฟล์หรือโฟลเดอร์คลิกขวาและ "ลบ" ไฟล์หรือโฟลเดอร์
  3. เมื่อคุณป้อน IDE อีกครั้งและเลือกโซลูชันแบบเปิดหรือแพ็กเกจ / โซลูชันเปิดไฟล์เก่าและชื่อโซลูชัน / แพ็กเกจจะหายไปเช่นเดียวกับคำสั่งพา ธ ที่ทำให้เข้าใจผิดซึ่งหลอกคอมไพลเลอร์และตัววิเคราะห์โค้ดเพื่อดูไดเร็กทอรีเก่าแม้ว่าคุณจะเปลี่ยน ชื่อไฟล์และเปลี่ยนชื่อโปรเจ็กต์จะไม่เปลี่ยนพา ธ ไดเร็กทอรีด้วย

Microsoft ต้องการแก้ไขปัญหาเหล่านี้จริงๆเพื่อให้คุณสามารถสร้างสิ่งที่คนส่วนใหญ่ต้องการสร้างเป็นไฟล์ใหม่ในไดเร็กทอรีเดียวกันและลบโซลูชันโดยการเลือกและลบออกจาก IDE ผู้เริ่มต้นรู้สึกผิดหวังอย่างมากกับคำสั่งเส้นทางไดเรกทอรีที่ยืดหยุ่นสำหรับนักพัฒนาที่มีประสบการณ์ แต่ก็ไม่ยุติธรรมสำหรับนักพัฒนาใหม่ในค่าเริ่มต้นของพวกเขา

หวังว่านี่จะช่วยคุณได้จริง ๆ และหยุดนักพัฒนามือฉมังจากการให้คำตอบผิด ๆ ที่ไม่เหมาะกับคุณ พวกเขาถือว่าคุณเข้าใจคำสั่งเส้นทางแล้วและเพียงแค่ต้องการพิมพ์รหัสที่ถูกต้อง ... ซึ่งเป็นสาเหตุที่อุโมงค์พยายามแก้ไขรหัสของคุณ แต่ไม่ได้ช่วยคุณแก้ไขปัญหา นี่อาจเป็นปัญหาที่พบบ่อยที่สุดที่อธิบายไว้อย่างต่อเนื่องใน stackoverflow พร้อมคำตอบที่ไม่ถูกต้องซึ่งใช้ไม่ได้กับโปรแกรมเมอร์มือใหม่


เพื่อสรุปคำตอบนี้ (สำหรับ VS 2017): rightclick P1 ใน solution explorer >>> add ... >>> reference ... >>> Projects >>> Solution >>> เลือกช่องทำเครื่องหมาย P2
andrew pate

7

ขั้นตอนแรกคือทำการอ้างอิง P2 P1 โดยทำดังต่อไปนี้

  • คลิกขวาที่โครงการและเลือก "เพิ่มข้อมูลอ้างอิง"
  • ไปที่แท็บโครงการ
  • เลือก P1 แล้วกดตกลง

ถัดไปคุณจะต้องตรวจสอบให้แน่ใจว่าคลาสใน P1 สามารถเข้าถึง P2 ได้ publicวิธีที่ง่ายที่สุดคือการทำให้พวกเขา

public class MyType { ... }

ตอนนี้คุณควรจะสามารถใช้มันใน P2 ผ่านชื่อที่มีคุณสมบัติครบถ้วน สมมติว่าเนมสเปซของ P1 คือ Project1 สิ่งต่อไปนี้จะใช้ได้

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

วิธีที่ต้องการคือการเพิ่มการใช้เพื่อProject1ให้คุณสามารถใช้ประเภทที่ไม่มีคุณสมบัติ

using Project1;
...

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

5

หากคุณมีสองโปรเจ็กต์ในโฟลเดอร์โซลูชันเดียวเพียงแค่เพิ่มการอ้างอิงของโปรเจ็กต์ลงในอีกอันการใช้เนมสเปซคุณจะได้รับคลาส ในขณะที่สร้างอ็อบเจ็กต์สำหรับคลาสที่ต้องการ เรียกใช้วิธีการที่คุณต้องการ

โครงการแรก:

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

เพิ่มการอ้างอิงถึงโครงการที่สองที่นี่

โครงการที่สอง:

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

4

ในโปรเจ็กต์ P1 กำหนดให้คลาสเป็นสาธารณะ (ถ้ายังไม่ได้ทำ) จากนั้นเพิ่มการอ้างอิงโครงการ (แทนที่จะเป็นการอ้างอิงไฟล์ซึ่งเป็นข้อผิดพลาดที่ฉันพบเป็นครั้งคราว) ไปที่ P2 เพิ่มคำสั่งใช้ใน P2 ในตำแหน่งที่ถูกต้องและเริ่มใช้คลาสจาก P1

(เพื่อกล่าวถึงสิ่งนี้: ทางเลือกในการทำให้คลาสเป็นสาธารณะคือการทำให้ P2 เป็นเพื่อนกับ P1 อย่างไรก็ตามนี่ไม่น่าจะเป็นคำตอบที่คุณต้องการเพราะมันจะมีผลบางอย่างดังนั้นให้ปฏิบัติตามคำแนะนำข้างต้น)


2

สมมติว่าชั้นเรียนของคุณในโครงการ 2 เรียกว่า MyClass

แน่นอนอันดับแรกอ้างอิงโครงการ 2 ของคุณภายใต้การอ้างอิงในโครงการ 1 จากนั้น

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.