Cách sử dụng một lớp từ một dự án C # với một dự án C # khác


110

Trong cùng một giải pháp, tôi có hai dự án: P1 và P2. Làm cách nào để sử dụng lớp P1 trong P2?


Câu hỏi tương tự ở đây
RBT

Câu trả lời:


65

Chỉ cần thêm tham chiếu đến P1 từ P2


12
Điều này sẽ không hoạt động nếu lớp học không công khai hoặc nếu P2 là bạn của P1.
Manfred

7
Trong trường hợp này, bạn có 3 tùy chọn: 1) Kết hợp 2 dự án 2) Đặt lớp nội bộ - và thêm P2 làm thuộc tính "InternalsVibleTo" (thêm thông tin tại đây: msdn.microsoft.com/en-us/library/… ). 3) Nếu không có ở trên có thể được thực hiện - bạn sẽ phải suy nghĩ sử dụng để instantinate và invoke lớp P1 từ P2
Nissim

21
Tôi sẽ thích một câu trả lời phức tạp hơn. Điều này cảm thấy gần như mỉa mai.
shteeven

5
Một ví dụ sẽ tốt hơn.
Paul Alexander

1
Ngoài ra, cả hai dự án cần phải nhắm mục tiêu cùng một khuôn khổ .NET. Kiểm tra các thuộc tính của từng dự án trên tab 'Ứng dụng', phải có 'Khung mục tiêu'. Cả hai dự án cần nhắm mục tiêu cùng một khuôn khổ ở đây.
Travis

193
  1. Trong cây 'Giải pháp Explorer', hãy mở rộng dự án P2, sau đó nhấp chuột phải vào dự án và chọn 'Thêm tài liệu tham khảo' từ menu.
  2. Trên hộp thoại 'Thêm tài liệu tham khảo', chọn tab 'Dự án' và chọn dự án P1 của bạn.
  3. Nếu bạn đang sử dụng không gian tên thì bạn sẽ cần nhập không gian tên cho các loại P1 của mình bằng cách thêm câu lệnh 'using' vào tệp của bạn trong P2.

Lưu ý rằng các loại trong P1 mà bạn muốn truy cập trực tiếp phải có đủ cấp độ truy cập: thông thường, điều này có nghĩa là chúng phải được đặt ở chế độ công khai.


Lời khuyên tuyệt vời, thưa ông. Tôi đã từng dán các liên kết, nhưng sau đó tôi phải cập nhật chúng mỗi khi tôi thay đổi đường dẫn của tệp. Với một tài liệu tham khảo dự án, tất cả dễ dàng hơn rất nhiều. Cảm ơn bạn!
IneedHelp

2
Điều gì sẽ xảy ra nếu bạn đã có tham chiếu đến P2 trong P1? Thực hiện ở trên sẽ tạo ra một "phụ thuộc vòng tròn" ...
colmde

4
@colmde có nó sẽ. Bạn sẽ phải tóm tắt các yếu tố mà bạn muốn chia sẻ vào một dự án thứ ba, mà bạn có thể đặt tiêu đề một cách hình tượng là P3, được tham chiếu bởi hai dự án kia.
Paul Ruane

Là một nhà phát triển không phải NET, tôi thực sự nghĩ rằng đây phải là câu trả lời được chấp nhận ... Cảm ơn bạn Paul (x2)
thisIsTheFoxe

16

Paul Ruane nói đúng, tôi vừa mới cố gắng xây dựng dự án. Tôi vừa tạo toàn bộ SLN để kiểm tra xem nó có hoạt động không.

Tôi đã thực hiện điều này trong VC # VS2008

<< (Chỉ giúp đỡ những người khác đọc được bài này bằng () bình luận)

Bước 1:

Tạo giải pháp có tên DoubleProject

Bước 2:

Tạo Dự án trong giải pháp có tên DoubleProjectTwo (để thực hiện việc này, hãy chọn tệp giải pháp, nhấp chuột phải -> Thêm -> Dự án mới)

Bây giờ tôi có hai dự án trong cùng một giải pháp

Bước 3:

Như Paul Ruane đã nói. đi đến các tham chiếu trong trình khám phá giải pháp (nếu đóng, nó nằm trong tab dạng xem của trình biên dịch). DoubleProjectTwo là chức năng / phương thức cần có của DoubleProject vì vậy trong DoubleProjectTwo tham chiếu chuột phải ở đó -> Thêm -> Dự án -> DoubleProject.

Bước 4:

Bao gồm chỉ thị cho không gian tên:

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

Bước 5:

Làm một cái gì đó cho tôi xem bằng chứng kết quả:

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

Chính

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

Điều đó sẽ làm các trick

Hi vọng điêu nay co ich

EDIT ::: rất tiếc đã quên lệnh gọi phương thức để thực sự thay đổi chuỗi, đừng làm như vậy :)


9

Tất cả các nhà phát triển mới thường hỏi câu hỏi đơn giản này, đây là một vấn đề phổ biến đặc biệt với Visual Studio IDE. Rất ít người trả lời câu hỏi cụ thể và thường chỉ trích câu hỏi hoặc đưa ra "phỏng đoán" cho các giải pháp không trả lời được các vấn đề chung. Vấn đề phổ biến đầu tiên là IDE dẫn bạn đến việc tạo các dự án mới thay vì thêm các tệp mới (.java, .py, .cpp, .c) vào giải pháp hiện có (theo mặc định nó tạo ra một giải pháp mới) trừ khi bạn thay đổi tên dự án và thêm vào giải pháp hiện tại. Sự cố này xảy ra đối với các thư mục dự án Python, java, c #, C ++ và C.

Điều này không xảy ra khi bạn thêm một dự án khác bằng cách sử dụng lệnh new> project> project type của IDE. Vấn đề ở đây là dự án mới được lưu trữ trong một thư mục khác với các tệp mã giao diện Người dùng hoặc Máy khách hiện có. Để tạo một "tệp" mới trong cùng một không gian dự án thay vì dự án mới, người mới bắt đầu cần thực hiện những điều sau mà Microsoft sẽ không làm cho bạn và thậm chí đánh lừa bạn khỏi điều hiển nhiên trực quan theo mặc định.

  1. Chọn "ứng dụng" bạn muốn nhập hành vi mới vào (từ một tệp khác)
  2. Chọn dự án> thêm mục mới
  3. Chọn "loại mẫu tệp chương trình" chẳng hạn như filetype.py, filetype.java, filetype.c, filetype.cpp, filetype.C #, v.v. hoặc loại tệp lớp thư viện (một cái gì đó khác với tùy chọn tệp khởi động mà bạn thấy khi tạo một dự án ứng dụng mới hoặc tạo một dự án thư viện mới).
  4. Một tên tệp mới với tên mặc định được tạo trong dự án của bạn.
  5. Thay đổi tên mặc định của tệp thành một cái gì đó như thư viện.py hoặc mặt tiền.java, v.v.

NGAY BÂY GIỜ, các đề xuất mã để nhập thư viện hoặc sử dụng không gian tên sẽ hoạt động như được mô tả trong các nhận xét ở trên và bạn không phải thay đổi câu lệnh đường dẫn hoặc thay đổi đường dẫn giải pháp và tên giải pháp mà Microsoft sẽ không cho phép bạn thay đổi dễ dàng (tức là bạn có thể thay đổi tên tệp hoặc tên dự án nhưng IDE sẽ không tự động thay đổi đường dẫn dự án hoặc tên đường dẫn giải pháp).

Sau đây là một ví dụ Python nhưng hoạt động tương tự đối với C #, java hoặc C / C ++ bằng cách sử dụng không gian tên, bao gồm hoặc sử dụng lệnh mã thích hợp với từng ngôn ngữ để tìm mã trong các lớp / dự án khác trong KHÔNG GIAN HƯỚNG DẪN CÙNG.

Tệp ứng dụng "hello world" nhập từ các tệp mã khác trong cùng thư mục.

Lưu ý rằng các dấu phân tách khoảng trắng python sẽ không đúng khoảng cách trong trình chỉnh sửa nhận xét stackoverflow này:

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

Tệp thư viện hoặc tệp "mặt tiền" chứa các lớp, phương thức hoặc hàm bạn muốn nhập.

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

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

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


pass

BÂY GIỜ bạn thực sự giải quyết mớ hỗn độn mà IDE dẫn bạn vào như thế nào? Để nhập mã từ tệp khác trong cùng không gian thư mục, bạn thêm một tham chiếu vào tệp đó.

  1. Chọn tệp ứng dụng
  2. Chọn Dự án> thêm tham chiếu
  3. Chọn tên tệp hiển thị với đường dẫn thư mục bên phải (kiểm tra nó)
  4. Tham chiếu hiện có sẵn cho trình thông dịch, trình kiểm tra mã và / hoặc trình biên dịch.

OK, vậy bây giờ bạn đã giải quyết được vấn đề này, làm thế nào để bạn thực sự liên kết hai dự án riêng biệt với nhau trong cùng một không gian giải pháp?

  1. Bạn phải đi tới cả tùy chọn trình lập chỉ mục hoặc "intellisense" và trình biên dịch / trình thông dịch và kiểm tra vật lý hoặc thay đổi / thêm các câu lệnh đường dẫn thư mục nếu chúng là thứ khác với những gì trỏ đến không gian giải pháp hoặc dự án "thứ hai" của bạn. Khi bạn thực hiện thay đổi đường dẫn hoặc thay đổi các biến đường dẫn đến không gian làm việc của bạn và đến các vị trí cụ thể của các dự án là các không gian thư mục khác nhau, trình biên dịch và trình phân tích mã sau đó có thể tìm thấy các thư viện, headers.h, không gian tên, vị trí dự án hoặc tệp này.
  2. Để loại bỏ các dự án cũ do bạn tạo ra do nhầm lẫn, điều đó thậm chí còn tồi tệ hơn. Bạn phải thoát Visual Studio IDE, mở windows explorer, đi tới thư mục không gian làm việc ... Documents \ visualstudio xxx \ solutionname \ packagename chọn tệp hoặc thư mục, nhấp chuột phải và "xóa" tệp hoặc thư mục.
  3. Khi bạn nhập lại IDE và chọn giải pháp mở hoặc gói / giải pháp mở, các tệp cũ và tên giải pháp / gói sẽ biến mất cũng như các câu lệnh đường dẫn gây hiểu lầm của chúng, điều này đánh lừa trình biên dịch và phân tích mã để xem thư mục cũ mặc dù bạn đã thay đổi tên tệp và thay đổi tên dự án, nó không thay đổi đường dẫn thư mục với nó.

Microsoft thực sự cần phải khắc phục những vấn đề này để bạn có thể trực quan tạo thứ mà hầu hết mọi người muốn tạo dưới dạng tệp mới trong cùng thư mục và xóa giải pháp bằng cách chọn chúng và xóa chúng khỏi IDE. Những người mới bắt đầu cảm thấy rất thất vọng với các câu lệnh về đường dẫn thư mục rất linh hoạt đối với các nhà phát triển dày dặn kinh nghiệm, nhưng lại không công bằng đối với các nhà phát triển mới về mặc định của họ.

Hy vọng điều này thực sự giúp ích cho các bạn mới và ngăn các nhà phát triển dày dạn đưa ra câu trả lời sai không phù hợp với bạn. Họ cho rằng bạn đã hiểu các câu lệnh về đường dẫn và chỉ muốn nhập đúng mã ... đó cũng là lý do tại sao đường hầm cố gắng sửa mã của bạn nhưng không giúp bạn khắc phục sự cố. Đây có lẽ là vấn đề phổ biến nhất được mô tả liên tục trên stackoverflow với các câu trả lời sai không hoạt động đối với các lập trình viên mới.


Để tóm tắt câu trả lời này (cho VS 2017): nhấp chuột phải vào P1 trong trình khám phá giải pháp >>> thêm ... >>> tham khảo ... >>> Dự án >>> Giải pháp >>> Chọn hộp kiểm P2.
andrew pate

7

Bước đầu tiên là tạo P2 tham chiếu P1 bằng cách thực hiện như sau

  • Nhấp chuột phải vào dự án và chọn "Thêm tài liệu tham khảo"
  • Chuyển đến tab Dự án
  • Chọn P1 và nhấn OK

Tiếp theo, bạn cần đảm bảo rằng các lớp trong P1 có thể truy cập P2. Cách đơn giản nhất là làm chúng public.

public class MyType { ... }

Bây giờ bạn sẽ có thể sử dụng chúng trong P2 thông qua tên đủ điều kiện của chúng. Giả sử không gian tên của P1 là Project1 thì điều sau sẽ hoạt động

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

Tuy nhiên, cách ưa thích là thêm using for Project1để bạn có thể sử dụng các loại mà không cần trình độ

using Project1;
...

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

5

Nếu bạn có hai dự án trong một thư mục giải pháp, chỉ cần thêm Tham chiếu của Dự án vào một dự án khác. Sử dụng Không gian tên, bạn có thể nhận được các lớp. Trong khi Tạo đối tượng cho lớp được yêu cầu đó. Gọi Phương thức mà bạn muốn.

FirstProject:

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

Ở đây thêm tham chiếu đến Dự án thứ hai

Dự án thứ hai:

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

4

Trong dự án P1, đặt lớp công khai (nếu chưa có). Sau đó, thêm tham chiếu dự án (thay vì tham chiếu tệp, một lỗi mà tôi thỉnh thoảng gặp phải) vào P2. Thêm câu lệnh using trong P2 vào đúng vị trí và bắt đầu sử dụng lớp từ P1.

(Đề cập đến điều này: Cách thay thế để công khai lớp học là đặt P2 làm bạn với P1. Tuy nhiên, đây không chắc là câu trả lời mà bạn đang theo đuổi vì nó sẽ gây ra một số hậu quả. Vì vậy, hãy kiên trì với gợi ý trên.)


2

Giả sử lớp của bạn trong dự án 2 được gọi là MyClass.

Rõ ràng, trước tiên hãy tham khảo dự án 2 của bạn dưới các tham chiếu trong dự án 1 sau đó

using namespaceOfProject2;

// for the class calling bit:

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

vì vậy bất cứ khi nào bạn muốn tham chiếu đến lớp đó, bạn gõ project2Class. Ngoài ra, hãy đảm bảo rằng lớp học đó cũng được công khai.


1

Tôi gặp sự cố với các khuôn khổ mục tiêu khác nhau.

Tôi đã làm mọi thứ đúng, nhưng không thể sử dụng tham chiếu trong P2. Sau khi tôi đặt cùng một khung mục tiêu cho P1 và P2, nó hoạt động như một sự quyến rũ.

Hy vọng nó sẽ giúp ích cho ai đó


Tôi đã gặp vấn đề tương tự, với các lỗi như The name ... does not exist in the current context. Cannot resolve symbol ...cho đến khi tôi thay đổi khung mục tiêu của dự án để phù hợp. (Nhấp chuột phải vào dự án và chuyển Project -> Properties -> Target frameworkđến để thay đổi điều này.)
sonny
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.