Cara menggunakan kelas dari satu proyek C # dengan proyek C # lainnya

110

Dalam solusi yang sama, saya punya dua proyek: P1 dan P2. Bagaimana saya bisa menggunakan kelas P1 di P2?

Strider007
sumber
Pertanyaan yang sangat mirip di sini
RBT

Jawaban:

65

Cukup tambahkan referensi ke P1 dari P2

Nissim
sumber
12
Ini tidak akan berfungsi jika kelas non-publik atau jika P2 adalah teman P1.
Manfred
7
Dalam hal ini Anda memiliki 3 opsi: 1) Gabungkan 2 proyek 2) Jadikan kelas internal - dan tambahkan P2 sebagai atribut "InternalsVisibleTo" (informasi selengkapnya di sini: msdn.microsoft.com/en-us/library/… ). 3) Jika semua hal di atas tidak dapat dilakukan - Anda harus menggunakan refleksi untuk menginstantinasi dan memanggil kelas P1 dari P2
Nissim
21
Saya lebih suka jawaban yang lebih rumit. Yang ini terasa hampir sarkastik.
shteeven
5
Contoh akan lebih baik.
Paul Alexander
1
Selain itu, kedua proyek harus menargetkan kerangka kerja .NET yang sama. Periksa setiap properti proyek pada tab 'Aplikasi' harus ada 'Kerangka target'. Kedua proyek perlu menargetkan kerangka yang sama di sini.
Travis
193
  1. Di pohon 'Solution Explorer', perluas proyek P2 dan kemudian klik kanan proyek dan pilih 'Add Reference' dari menu.
  2. Pada dialog 'Tambahkan Referensi', pilih tab 'Proyek' dan pilih proyek P1 Anda.
  3. Jika Anda menggunakan ruang nama maka Anda perlu mengimpor ruang nama untuk tipe P1 Anda dengan menambahkan pernyataan 'menggunakan' ke file Anda di P2.

Perhatikan bahwa jenis di P1 yang ingin Anda akses secara langsung harus memiliki tingkat akses yang memadai: biasanya ini berarti jenis tersebut harus dipublikasikan.

Paul Ruane
sumber
Saran yang bagus, Pak. Saya biasa menempelkan tautan, tetapi kemudian saya harus memperbaruinya setiap kali saya mengubah jalur file. Dengan referensi proyek semuanya jauh lebih mudah. Terima kasih!
IneedHelp
2
Bagaimana jika Anda sudah memiliki referensi ke P2 di P1? Melakukan hal di atas akan membuat "ketergantungan melingkar" ...
colmde
4
@colmde ya itu akan. Anda harus mengabstraksi elemen yang ingin Anda bagikan ke dalam proyek ketiga, yang secara imajinatif dapat Anda beri judul P3, yang direferensikan oleh dua proyek lainnya.
Paul Ruane
Sebagai pengembang non-NET, saya pikir ini harus menjadi jawaban yang diterima ... Terima kasih Paul (x2)
thisIsTheFoxe
16

Paul Ruane benar, saya baru saja mencoba membangun proyek itu sendiri. Saya baru saja membuat SLN utuh untuk diuji apakah berhasil.

Saya membuat ini di VC # VS2008

<< (Hanya membantu orang lain yang membaca ini juga dengan () komentar)

Langkah 1:

Buat solusi yang disebut DoubleProject

Langkah 2:

Buat Proyek dalam solusi bernama DoubleProjectTwo (untuk melakukan ini pilih file solusi, klik kanan -> Tambah -> Proyek Baru)

Saya sekarang memiliki dua proyek dalam solusi yang sama

Step3:

Seperti yang dikatakan Paul Ruane. buka referensi di explorer solusi (jika ditutup, itu ada di tab tampilan kompilator). DoubleProjectTwo adalah salah satu fungsi / metode yang dibutuhkan dari DoubleProject jadi di referensi mouse kanan DoubleProjectTwo ada -> Tambah -> Proyek -> DoubleProject.

Step4:

Sertakan direktif untuk namespace:

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:

Buat sesuatu tunjukkan bukti hasil:

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

Utama

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

Itu HARUS berhasil

Semoga ini membantu

EDIT ::: whoops lupa pemanggilan metode untuk benar-benar mengubah string, jangan lakukan hal yang sama :)

Proclyon
sumber
9

Terlalu sering pengembang baru menanyakan pertanyaan sederhana ini yang merupakan masalah umum khususnya dengan Visual Studio IDE. Hanya sedikit orang yang menjawab pertanyaan spesifik dan sering mengkritik pertanyaan atau memberikan "tebakan" untuk solusi yang tidak menjawab masalah umum. Masalah umum pertama adalah IDE mengarahkan Anda untuk membuat proyek baru daripada menambahkan file baru (.java, .py, .cpp, .c) ke solusi yang ada (secara default akan membuat solusi baru) kecuali Anda mengubah nama proyek dan tambahkan ke solusi saat ini. Masalah ini terjadi untuk folder proyek Python, java, c #, C ++ dan C.

Ini tidak terjadi ketika Anda menambahkan proyek lain menggunakan perintah new> project> project type dari IDE. Masalahnya di sini adalah proyek baru disimpan dalam direktori yang berbeda dari file kode antarmuka Klien atau Pengguna yang ada. Untuk membuat "file" baru dalam ruang proyek yang sama daripada proyek baru, pemula perlu melakukan hal berikut yang tidak akan dilakukan Microsoft untuk Anda dan bahkan menyesatkan Anda dari hal yang sudah jelas secara intuitif secara default.

  1. Pilih "aplikasi" tempat Anda ingin mengimpor perilaku baru (dari file lain)
  2. Pilih proyek> tambahkan item baru
  3. Pilih "jenis template file program" seperti filetype.py, filetype.java, filetype.c, filetype.cpp, filetype.C #, dll. Atau jenis file kelas perpustakaan (sesuatu selain opsi file startup yang Anda lihat saat membuat proyek aplikasi baru atau buat proyek perpustakaan baru).
  4. Nama file baru dengan nama default dibuat di proyek Anda.
  5. Ubah nama default file menjadi sesuatu seperti library.py atau façade.java, dll.

SEKARANG rekomendasi kode untuk mengimpor pustaka atau menggunakan namespace akan berfungsi seperti yang dijelaskan dalam komentar di atas dan Anda tidak perlu mengubah pernyataan jalur atau mengubah jalur solusi dan nama solusi yang Microsoft tidak akan membiarkan Anda mengubah dengan mudah (yaitu Anda dapat mengubah nama file atau nama proyek, tetapi IDE tidak akan secara otomatis mengubah jalur proyek atau nama jalur solusi).

Berikut ini adalah contoh Python tetapi bekerja serupa untuk C #, java, atau C / C ++ menggunakan termasuk, ruang nama atau menggunakan perintah kode yang sesuai untuk setiap bahasa untuk menemukan kode di kelas / proyek lain di RUANG DIREKTORI YANG SAMA.

File aplikasi "hello world" diimpor dari file kode lain di direktori yang sama.

Perhatikan bahwa pembatas spasi putih python tidak akan menjadi spasi dengan benar di editor komentar stackoverflow ini:

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

File pustaka atau file "façade" yang berisi kelas, metode, atau fungsi yang ingin Anda impor.

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

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

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


pass

SEKARANG bagaimana Anda benar-benar menyelesaikan kekacauan yang dituntun oleh IDE? Untuk mengimpor kode dari file lain di ruang direktori yang sama Anda menambahkan referensi padanya.

  1. Pilih file aplikasi
  2. Pilih Proyek> tambahkan referensi
  3. Pilih nama file yang terlihat dengan jalur direktori yang benar (centang)
  4. Referensi sekarang tersedia untuk penerjemah, pemeriksa kode dan / atau kompilator.

Oke, sekarang setelah masalah Anda teratasi, bagaimana Anda benar-benar menghubungkan dua proyek terpisah bersama dalam ruang solusi yang sama?

  1. Anda harus pergi ke opsi pengindeks atau "intellisense" dan compiler / interpreter dan secara fisik memeriksa atau mengubah / menambahkan pernyataan jalur direktori jika pernyataan itu adalah sesuatu selain yang menunjuk ke proyek "kedua" atau ruang solusi Anda. Ketika Anda melakukan perubahan jalur atau mengubah variabel jalur ke ruang kerja Anda dan ke lokasi tertentu dari proyek yang merupakan ruang direktori berbeda, kompilator dan penganalisis kode kemudian dapat menemukan pustaka, header.h, ruang nama, lokasi proyek atau file ini.
  2. Untuk menghapus proyek lama yang Anda buat karena kesalahan, itu bahkan lebih buruk. Anda harus keluar dari Visual Studio IDE, buka windows explorer, masuk ke direktori workspace ... documents \ visualstudio xxx \ solutionname \ packagename pilih file atau folder, klik kanan dan "delete" file atau folder.
  3. Ketika Anda memasukkan kembali IDE dan memilih solusi terbuka atau membuka paket / solusi, file lama dan nama solusi / paket akan hilang seperti pernyataan jalur menyesatkannya yang menipu compiler dan penganalisis kode untuk melihat direktori lama meskipun Anda mengubahnya nama file dan mengubah nama proyek, itu tidak mengubah jalur direktori dengannya.

Microsoft benar-benar perlu memperbaiki masalah ini sehingga Anda dapat secara intuitif membuat apa yang kebanyakan orang ingin buat sebagai file baru di direktori yang sama dan menghapus solusi dengan memilihnya dan menghapusnya dari IDE. Pemula menjadi sangat frustrasi dengan pernyataan jalur direktori yang begitu fleksibel untuk pengembang berpengalaman, tetapi sangat tidak adil bagi pengembang baru dalam pengaturan default mereka.

Semoga ini benar-benar membantu Anda orang baru dan menghentikan pengembang berpengalaman memberi Anda jawaban yang salah yang tidak berhasil untuk Anda. Mereka menganggap Anda sudah memahami pernyataan jalur dan hanya ingin mengetikkan kode yang benar ... yang juga merupakan alasan mengapa terowongan mencoba memperbaiki kode Anda tetapi tidak membantu Anda memperbaiki masalah. Ini mungkin masalah paling umum yang terus dijelaskan di stackoverflow dengan jawaban yang salah yang tidak berfungsi untuk pemrogram baru.

mwh
sumber
Untuk meringkas jawaban ini (untuk VS 2017): klik kanan P1 di explorer solusi >>> tambahkan ... >>> referensi ... >>> Proyek >>> Solusi >>> Centang kotak P2.
andrew pate
7

Langkah pertama membuat referensi P2 P1 dengan melakukan hal berikut

  • Klik kanan pada proyek dan pilih "Tambahkan Referensi"
  • Buka Tab Proyek
  • Pilih P1 dan tekan OK

Selanjutnya Anda harus memastikan bahwa kelas di P1 dapat diakses oleh P2. Cara termudah adalah membuatnya public.

public class MyType { ... }

Sekarang Anda harus dapat menggunakannya di P2 melalui nama yang sepenuhnya memenuhi syarat. Dengan asumsi namespace P1 adalah Project1, maka berikut ini akan berfungsi

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

Cara yang lebih disukai adalah dengan menambahkan penggunaan untuk Project1sehingga Anda dapat menggunakan tipe tanpa kualifikasi

using Project1;
...

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

Jika Anda memiliki dua proyek dalam satu folder solusi. Cukup tambahkan Referensi Proyek ke yang lain. Menggunakan Namespace Anda bisa mendapatkan kelas. Saat membuat objek untuk itu kelas yang diperlukan. Panggil Metode yang Anda inginkan.

FirstProject:

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

Di sini tambahkan referensi ke Proyek Kedua

SecondProject:

class SeccondClass
{
    FirstProject.FirstClass obj=new FirstProject.FirstClass();
    obj.Name();
}
Hemant Kumar
sumber
4

Dalam proyek P1 buat kelas menjadi publik (jika belum). Kemudian tambahkan referensi proyek (daripada referensi file, kesalahan yang kadang-kadang saya temui) ke P2. Tambahkan pernyataan using di P2 di tempat yang benar dan mulai gunakan kelas dari P1.

(Untuk menyebutkan ini: Alternatif untuk membuat kelas publik akan menjadikan P2 sebagai teman untuk P1. Namun, ini tidak mungkin menjadi jawaban yang Anda cari karena akan memiliki beberapa konsekuensi. Jadi tetaplah dengan saran di atas.)

Manfred
sumber
2

Katakanlah kelas Anda di proyek 2 disebut MyClass.

Jelas, pertama rujuk proyek Anda 2 di bawah referensi dalam proyek 1 lalu

using namespaceOfProject2;

// for the class calling bit:

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

jadi kapan pun Anda ingin mereferensikan kelas itu, Anda mengetik project2Class. Selain itu, pastikan kelas itu juga untuk umum.

Connor
sumber
1

Saya memiliki masalah dengan kerangka kerja target yang berbeda.

Saya melakukan semuanya dengan benar, tetapi tidak bisa menggunakan referensi di P2. Setelah saya menetapkan kerangka target yang sama untuk P1 dan P2, itu bekerja seperti pesona.

Semoga bisa membantu seseorang

Vitalie Belinschi
sumber
Saya memiliki masalah yang sama, dengan kesalahan seperti The name ... does not exist in the current context. Cannot resolve symbol ...sampai saya mengubah kerangka kerja target proyek agar sesuai. (Klik kanan proyek dan pergi ke Project -> Properties -> Target frameworkuntuk mengubahnya.)
sonny