Bir C # projesindeki bir sınıfı başka bir C # projesiyle kullanma


Yanıtlar:


65

P2'den P1'e referans eklemeniz yeterlidir


12
Sınıf herkese açık değilse veya P2, P1'in bir arkadaşı ise bu işe yaramaz.
Manfred

7
Bu durumda 3 seçeneğiniz vardır: 1) 2 projeyi birleştirin 2) Sınıfı dahili yapın - ve P2'yi "InternalsVisibleTo" özniteliği olarak ekleyin (burada daha fazla bilgi: msdn.microsoft.com/en-us/library/… ). 3) Yukarıdakilerden hiçbiri yapılamazsa - P2 sınıfından P1 sınıfını başlatmak ve çağırmak için yansıma kullanmanız gerekecek
Nissim

21
Daha ayrıntılı bir cevabı tercih ederdim. Bu neredeyse alaycı geliyor.
shteeven

5
Bir örnek daha iyi olurdu.
Paul Alexander

1
Ayrıca, her iki projenin de aynı .NET çerçevesini hedeflemesi gerekir. 'Uygulama' sekmesinde her projenin özelliklerini kontrol edin, bir 'Hedef çerçeve' olmalıdır. Her iki projenin de burada aynı çerçeveyi hedeflemesi gerekiyor.
Travis

194
  1. 'Solution Explorer' ağacında, P2 projesini genişletin ve ardından projeye sağ tıklayın ve menüden 'Add Reference' seçeneğini seçin.
  2. 'Referans Ekle' iletişim kutusunda, 'Projeler' sekmesini seçin ve P1 projenizi seçin.
  3. Ad alanlarını kullanıyorsanız, P2'deki dosyalarınıza 'using' ifadeleri ekleyerek P1 türleriniz için ad alanlarını içe aktarmanız gerekecektir.

Doğrudan erişmek istediğiniz P1'deki türlerin yeterli erişim düzeyine sahip olması gerektiğini unutmayın: tipik olarak bu, herkese açık hale getirilmeleri gerektiği anlamına gelir.


Mükemmel tavsiye efendim. Bağlantıları yapıştırırdım, ancak daha sonra bir dosyanın yolunu her değiştirdiğimde onları güncellemem gerekiyordu. Bir proje referansı ile her şey çok daha kolay. Teşekkür ederim!
IneedHelp

2
Ya P1'de P2'ye zaten bir referansınız varsa? Yukarıdakileri yapmak "döngüsel bir bağımlılık" yaratacaktır ...
colmde

4
@colmde evet olur. Paylaşmak istediğiniz unsurları, diğer iki proje tarafından atıfta bulunulan, hayal gücünüzle P3 olarak adlandırabileceğiniz üçüncü bir projede soyutlamanız gerekir.
Paul Ruane

NET olmayan bir geliştirici olarak, bunun gerçekten kabul edilen cevap olması gerektiğini düşünüyorum ... Teşekkürler Paul (x2)
thisIsTheFoxe

16

Paul Ruane haklı, biraz önce projeyi inşa etmeye çalıştım. Çalışıp çalışmadığını test etmek için tam bir SLN yaptım.

Bunu VC # VS2008'de yaptım

<< (Sadece bunu okuyan diğer insanlara () yorumlarla yardımcı olmak)

Aşama 1:

DoubleProject adlı çözüm yapın

Adım 2:

DoubleProjectTwo adlı çözümde Proje oluşturun (bunu yapmak için çözüm dosyasını seçin, sağ tıklayın -> Ekle -> Yeni Proje)

Şimdi aynı çözümde iki projem var

Aşama 3:

Paul Ruane'nin belirttiği gibi. çözüm gezginindeki referanslara gidin (kapalıysa, derleyicinin görünüm sekmesindedir). DoubleProjectTwo, DoubleProject'in ihtiyaç duyduğu işlevlere / yöntemlere sahiptir, bu nedenle DoubleProject'te iki sağ fare referansı vardır -> Ekle -> Projeler -> DoubleProject.

Adım4:

Ad alanı için yönergeyi ekleyin:

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

Adım 5:

Bana sonuçların kanıtını göster:

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

Ana

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

Bu hile yapmalı

Bu yardımcı olur umarım

DÜZENLEME ::: whoops, dizeyi değiştirmek için yöntem çağrısını unuttu, aynısını yapma :)


9

Çoğu zaman yeni bir geliştirici, özellikle Visual Studio IDE'lerinde ortak bir sorun olan bu basit soruyu sorar. Çok az insan belirli bir soruyu yanıtlar ve genellikle soruyu eleştirir veya genel sorunlara yanıt vermeyen çözümler için "tahminler" yapar. İlk yaygın sorun, proje adını değiştirmediğiniz sürece mevcut çözüme (varsayılan olarak yeni bir çözüm oluşturur) yeni dosyalar (.java, .py, .cpp, .c) eklemek yerine yeni projeler oluşturmanıza neden olan IDE'nin sizi yönlendirmesidir. ve mevcut çözüme ekleyin. Bu sorun Python, java, c #, C ++ ve C proje klasörleri için oluşur.

IDE'nin yeni> proje> proje türü komutlarını kullanarak başka bir proje eklediğinizde bu gerçekleşmez. Buradaki sorun, yeni projenin mevcut İstemci veya Kullanıcı arayüzü kod dosyalarından farklı bir dizinde depolanmasıdır. Yeni proje yerine aynı proje alanında yeni bir "dosya" oluşturmak için, yeni başlayanlar, Microsoft'un sizin için yapmayacağı ve hatta sizi varsayılan olarak sezgisel olarak açık olanlardan uzaklaştıracak şekilde aşağıdakileri yapması gerekir.

  1. Yeni davranışı içe aktarmak istediğiniz "uygulamayı" seçin (başka bir dosyadan)
  2. Proje seçin> yeni öğe ekleyin
  3. Filetype.py, filetype.java, filetype.c, filetype.cpp, filetype.C # vb. Gibi "program dosyası şablonu türünü" veya bir kitaplık sınıfı dosya türünü (oluşturduğunuzda gördüğünüz başlangıç ​​dosya seçeneklerinden başka bir şey) seçin. yeni bir uygulama projesi veya yeni bir kitaplık projesi oluşturun).
  4. Projenizde varsayılan adla yeni bir dosya adı oluşturulur.
  5. Dosyanın varsayılan adını library.py veya façade.java gibi bir adla değiştirin.

ŞİMDİ kitaplıkları içe aktarmak veya ad alanlarını kullanmak için kod önerileri, yukarıdaki yorumlarda açıklandığı gibi çalışacak ve Microsoft'un kolayca değiştirmenize izin vermeyeceği yol ifadelerini veya çözüm yollarını ve çözüm adlarını değiştirmeniz gerekmeyecek (yani, dosya adları veya proje adları ancak IDE proje yolunu veya çözüm yolu adlarını otomatik olarak değiştirmez).

Aşağıdaki bir Python örneğidir, ancak C #, java veya C / C ++ için benzer şekilde çalışır; içerirler, ad alanları veya AYNI DİZİN ALANI içindeki diğer sınıflarda / projelerde kod bulmak için her dile uygun kod komutlarını kullanır.

Aynı dizindeki diğer kod dosyalarından içe aktarılan "merhaba dünya" uygulama dosyası.

Python beyaz boşluk sınırlayıcılarının bu stackoverflow yorum düzenleyicisinde doğru şekilde boşluk bırakmayacağını unutmayın:

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

İçe aktarmak istediğiniz sınıfları, yöntemleri veya işlevleri içeren kitaplık dosyası veya "cephe" dosyası.

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

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

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


pass

ŞİMDİ IDE'nin sizi içine sürüklediği karmaşayı aslında nasıl çözersiniz? Aynı dizin alanındaki başka bir dosyadan kod içe aktarmak için ona bir referans eklersiniz.

  1. Uygulama dosyasını seçin
  2. Proje> referans ekle'yi seçin
  3. Doğru dizin yolu ile görünen dosya adını seçin (kontrol edin)
  4. Referans artık yorumlayıcı, kod denetleyici ve / veya derleyici tarafından kullanılabilir.

Tamam, şimdi bu sorunu çözdünüze göre, iki ayrı projeyi aynı çözüm alanında gerçekten birbirine nasıl bağlarsınız?

  1. Hem dizinleyici hem de "intellisense" seçeneklerine ve derleyiciye / yorumlayıcıya gitmeli ve "ikinci" projenize veya çözüm alanınıza işaret edenlerden farklıysa, dizin yolu ifadelerini fiziksel olarak kontrol etmeli veya değiştirmeli / eklemelisiniz. Yol değişikliklerini yaptığınızda veya çalışma alanınıza ve farklı dizin alanları olan projelerin belirli konumlarına giden yol değişkenlerini değiştirdiğinizde, derleyici ve kod analizcisi bu kitaplıkları, başlıkları.h, ad alanlarını, proje veya dosya konumlarını bulabilir.
  2. Yanlışlıkla oluşturduğunuz eski projeleri kaldırmak daha da kötüdür. Visual Studio IDE'den çıkmanız, Windows gezginini açmanız, çalışma alanı dizinine gitmeniz gerekir ... belgeler \ visualstudio xxx \ çözümadı \ paketadı dosya veya klasörü seçin, sağ tıklayın ve dosya veya klasörü "silin".
  3. IDE'ye yeniden girip açık çözümü veya açık paketi / çözümü seçtiğinizde, eski dosyalar ve çözüm / paket adları, değiştirmiş olsanız bile derleyiciyi ve kod analizcisini eski dizine bakmaya kandıran yanıltıcı yol ifadeleri gibi kaybolur. dosya adını değiştirir ve proje adını değiştirir, bununla dizin yolunu değiştirmez.

Microsoft'un gerçekten ama gerçekten bu sorunu çözmesi gerekiyor, böylece çoğu insanın aynı dizinlerde yeni dosyalar olarak oluşturmak istediklerini sezgisel olarak oluşturabilir ve çözümleri seçerek ve IDE'den silerek kaldırabilirsiniz. Yeni başlayanlar, deneyimli geliştiriciler için çok esnek olan dizin yolu ifadelerinden çok rahatsız oluyor, ancak varsayılan değerlerinde yeni geliştiricilere çok haksızlık ediyor.

Umarım bu, yeni adamlara gerçekten yardımcı olur ve deneyimli geliştiricilerin işinize yaramayan yanlış cevapları vermesini engeller. Zaten yol ifadelerini anladığınızı ve sadece doğru kodu yazmak istediğinizi varsayarlar ... bu da kodunuzu düzeltmeye çalışmakla ilgili tünelin nedenini oluşturur, ancak sorunu çözmenize yardımcı olmaz. Bu muhtemelen, yeni programcılar için işe yaramayan yanlış cevaplarla sürekli olarak stackoverflow'da açıklanan en yaygın sorundur.


Bu cevabı özetlemek için (VS 2017 için): Çözüm gezgininde P1'e sağ tıklayın >>> ekle ... >>> referans ... >>> Projeler >>> Çözüm >>> P2 onay kutusunu işaretleyin.
andrew pate

7

İlk adım, aşağıdakileri yaparak P2 referans P1 yapmaktır.

  • Projeye sağ tıklayın ve "Referans Ekle" yi seçin
  • Projeler Sekmesine gidin
  • P1'i seçin ve Tamam'a basın

Daha sonra, P1'deki sınıfların P2 tarafından erişilebilir olduğundan emin olmanız gerekir. En kolay yol onları yapmaktır public.

public class MyType { ... }

Artık bunları tam adlarıyla P2'de kullanabilmelisiniz. P1 ad alanının Project1 olduğunu varsayarsak, aşağıdakiler işe yarar

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

Tercih edilen yol Project1, türleri niteliksiz olarak kullanabilmeniz için bir kullanım eklemektir.

using Project1;
...

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

5

Bir çözüm klasöründe iki projeniz varsa, Projenin Referansını diğerine eklemeniz yeterlidir. Ad alanını kullanarak sınıfları alabilirsiniz. Bunun için nesneyi oluştururken, gerekli sınıf. İstediğiniz Yöntemi arayın.

FirstProject:

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

Burada İkinci Projeye referans ekleyin

SecondProject:

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

4

P1 projesinde sınıfı herkese açık hale getirin (henüz değilse). Ardından P2'ye bir proje referansı ekleyin (dosya referansı yerine, ara sıra karşılaştığım bir hata). P2'de doğru yere bir using ifadesi ekleyin ve P1'deki sınıfı kullanmaya başlayın.

(Bundan bahsetmek gerekirse: Sınıfı halka açık hale getirmenin alternatifi, P2'yi P1'e arkadaş yapmaktır. Ancak, bazı sonuçları olacağından, aradığınız cevap bu değildir. Bu nedenle yukarıdaki öneriye sadık kalın.)


2

Diyelim ki proje 2'deki sınıfınızın adı MyClass.

Açıkçası, önce projeniz 2'ye proje 1'deki referanslar altında referans verin, sonra

using namespaceOfProject2;

// for the class calling bit:

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

bu nedenle bu sınıfa başvurmak istediğinizde project2Class yazarsınız. Ayrıca sınıfın da herkese açık olduğundan emin olun.


1

Farklı hedef çerçevelerle ilgili bir sorun yaşadım.

Her şeyi doğru yapıyordum, ancak P2'deki referansı kullanamadım. P1 ve P2 için aynı hedef çerçeveyi belirledikten sonra, harika çalıştı.

Umarım birine yardımcı olur


The name ... does not exist in the current context. Cannot resolve symbol ...Projelerin hedef çerçevelerini eşleşecek şekilde değiştirene kadar aynı sorunu yaşadım. (Projeye sağ tıklayın ve Project -> Properties -> Target frameworkbunu değiştirmek için gidin .)
sonny
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.