Jak używać klasy z jednego projektu C # z innym projektem C #

110

W tym samym rozwiązaniu mam dwa projekty: P1 i P2. Jak mogę skorzystać z klasy P1 w P2?

Strider007
źródło
Bardzo podobne pytanie tutaj
RBT

Odpowiedzi:

65

Po prostu dodaj odniesienie do P1 z P2

Nissim
źródło
12
To nie zadziała, jeśli klasa jest niepubliczna lub jeśli P2 jest przyjacielem P1.
Manfred
7
W tym przypadku masz 3 opcje: 1) Połącz 2 projekty 2) Ustaw klasę jako wewnętrzną - i dodaj P2 jako atrybut „InternalsVisibleTo” (więcej informacji tutaj: msdn.microsoft.com/en-us/library/… ). 3) Jeśli nie można zrobić żadnego z powyższych - będziesz musiał użyć refleksji, aby utworzyć instancję i wywołać klasę P1 z P2
Nissim
21
Wolałbym bardziej rozbudowaną odpowiedź. Ten wydaje się niemal sarkastyczny.
shteeven
5
Przykład byłby lepszy.
Paul Alexander
1
Ponadto oba projekty muszą być przeznaczone dla tej samej platformy .NET. Sprawdź właściwości każdego projektu w zakładce „Aplikacja”, gdzie powinna znajdować się „Struktura docelowa”. Oba projekty muszą być ukierunkowane na te same ramy.
Travis
194
  1. W drzewie „Eksplorator rozwiązań” rozwiń projekt P2, a następnie kliknij projekt prawym przyciskiem myszy i wybierz z menu polecenie „Dodaj odniesienie”.
  2. W oknie dialogowym „Dodaj odniesienie” wybierz kartę „Projekty” i wybierz projekt P1.
  3. Jeśli używasz przestrzeni nazw, będziesz musiał zaimportować przestrzenie nazw dla typów P1, dodając instrukcje „using” do plików w P2.

Zwróć uwagę, że typy w P1, do których chcesz uzyskać bezpośredni dostęp, muszą mieć wystarczający poziom dostępu: zazwyczaj oznacza to, że muszą być upublicznione.

Paul Ruane
źródło
Wspaniała rada, sir. Kiedyś wklejałem linki, ale potem musiałem je aktualizować za każdym razem, gdy zmieniałem ścieżkę do pliku. Z odniesieniem do projektu wszystko jest o wiele łatwiejsze. Dziękuję Ci!
IneedHelp
2
A co jeśli masz już odniesienie do P2 w P1? Wykonanie powyższego spowodowałoby powstanie „zależności cyklicznej” ...
colmde,
4
@colmde tak, byłoby. Musiałbyś wyodrębnić elementy, które chcesz udostępnić, do trzeciego projektu, do którego można sobie wyobrazić tytuł P3, do którego odwołują się pozostałe dwa projekty.
Paul Ruane,
Jako programista spoza NET naprawdę uważam, że to powinna być akceptowana odpowiedź ... Dziękuję Paul (x2)
thisIsTheFoxe
16

Paul Ruane ma rację, właśnie próbowałem samodzielnie zbudować projekt. Właśnie stworzyłem cały SLN, aby sprawdzić, czy działa.

Zrobiłem to w VC # VS2008

<< (Pomaganie tylko innym osobom, które to czytają, dodając () komentarze)

Krok 1:

Stwórz rozwiązanie o nazwie DoubleProject

Krok 2:

Utwórz projekt w rozwiązaniu o nazwie DoubleProjectTwo (w tym celu wybierz plik rozwiązania, kliknij prawym przyciskiem myszy -> Dodaj -> Nowy projekt)

Mam teraz dwa projekty w tym samym rozwiązaniu

Krok 3:

Jak stwierdził Paul Ruane. przejdź do odniesień w eksploratorze rozwiązań (jeśli jest zamknięty, znajduje się na karcie widoku kompilatora). DoubleProjectTwo jest tym, który potrzebuje funkcji / metod DoubleProject, więc w DoubleProjectTwo prawym przyciskiem myszy odnośnik -> Dodaj -> Projekty -> DoubleProject.

Krok 4:

Uwzględnij dyrektywę dotyczącą przestrzeni nazw:

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

Krok 5:

Zrób coś, co pokaże mi dowód wyników:

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

Główny

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

TO POWINNO załatwić sprawę

Mam nadzieję że to pomoże

EDYCJA ::: ups zapomniałem wywołania metody, aby faktycznie zmienić ciąg, nie rób tego samego :)

Proclyon
źródło
9

Zbyt często nowy programista zadaje to proste pytanie, które jest częstym problemem, szczególnie w środowisku IDE programu Visual Studio. Niewiele osób odpowiada na konkretne pytanie i często poddaje je krytyce lub „domysły” rozwiązań, które nie odpowiadają na typowe problemy. Pierwszym częstym problemem jest to, że IDE prowadzi cię do tworzenia nowych projektów, zamiast dodawać nowe pliki (.java, .py, .cpp, .c) do istniejącego rozwiązania (domyślnie tworzy nowe rozwiązanie), chyba że zmienisz nazwę projektu i dodaj do obecnego rozwiązania. Ten problem występuje w przypadku folderów projektów w językach Python, Java, C #, C ++ i C.

Nie dzieje się tak, gdy dodajesz inny projekt za pomocą nowych poleceń> projekt> typ projektu w środowisku IDE. Problem polega na tym, że nowy projekt jest przechowywany w innym katalogu niż istniejące pliki kodu interfejsu klienta lub użytkownika. Aby utworzyć nowy „plik” w tej samej przestrzeni projektu, a nie w nowym projekcie, początkujący musi wykonać następujące czynności, których Microsoft nie zrobi za Ciebie, a nawet odwiedzie Cię od intuicyjnie oczywistych, domyślnych.

  1. Wybierz „aplikację”, do której chcesz zaimportować nowe zachowanie (z innego pliku)
  2. Wybierz projekt> dodaj nowy element
  3. Wybierz „typ szablonu pliku programu”, taki jak filetype.py, filetype.java, filetype.c, filetype.cpp, filetype.C # itp. Lub typ pliku klasy biblioteki (coś innego niż opcje pliku startowego, które widzisz podczas tworzenia nowy projekt aplikacji lub utwórz nowy projekt biblioteki).
  4. W projekcie zostanie utworzona nowa nazwa pliku z domyślną nazwą.
  5. Zmień domyślną nazwę pliku na coś takiego jak library.py lub façade.java itp.

TERAZ zalecenia dotyczące kodu dotyczące importowania bibliotek lub korzystania z przestrzeni nazw będą działać zgodnie z opisem w komentarzach powyżej i nie musisz zmieniać instrukcji ścieżki ani zmieniać ścieżek rozwiązań i nazw rozwiązań, których Microsoft nie pozwoli ci łatwo zmienić (tj. Możesz zmienić nazwy plików lub nazwy projektów, ale IDE nie zmieni automatycznie ścieżki projektu ani nazw ścieżek rozwiązań).

Poniżej znajduje się przykład Pythona, ale działa podobnie dla C #, java lub C / C ++ przy użyciu dołączeń, przestrzeni nazw lub przy użyciu poleceń kodowych odpowiednich dla każdego języka, aby znaleźć kod w innych klasach / projektach w TYM SAMYM KATALOGU.

Plik aplikacji „hello world” importujący z innych plików kodu w tym samym katalogu.

Zwróć uwagę, że ograniczniki spacji w Pythonie nie będą poprawnie umieszczane w tym edytorze komentarzy typu 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

Plik biblioteki lub plik „fasady” zawierający klasy, metody lub funkcje, które chcesz zaimportować.

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

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

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


pass

TERAZ, jak właściwie rozwiązać bałagan, w który wprowadza Cię IDE? Aby zaimportować kod z innego pliku w tym samym katalogu, należy dodać do niego odniesienie.

  1. Wybierz plik aplikacji
  2. Wybierz Projekt> dodaj odniesienie
  3. Wybierz nazwę pliku widoczną z właściwą ścieżką do katalogu (sprawdź)
  4. Odwołanie jest teraz dostępne dla interpretera, modułu sprawdzającego kod i / lub kompilatora.

OK, więc teraz, gdy masz już rozwiązany ten problem, jak naprawdę połączyć ze sobą dwa oddzielne projekty w tej samej przestrzeni rozwiązań?

  1. Musisz przejść zarówno do opcji indeksatora lub „intellisense”, jak i do kompilatora / interpretera i fizycznie sprawdzić lub zmienić / dodać instrukcje ścieżki katalogu, jeśli są one czymś innym niż te, które wskazują na Twój „drugi” projekt lub przestrzeń rozwiązań. Kiedy zmieniasz ścieżki lub zmienisz ścieżki do swojego obszaru roboczego i do konkretnych lokalizacji projektów, które są różnymi przestrzeniami katalogów, kompilator i analizator kodu mogą następnie znaleźć te biblioteki, nagłówki.h, przestrzenie nazw, projekty lub lokalizacje plików.
  2. Usunięcie starych projektów, które stworzyłeś przez pomyłkę, jest jeszcze gorsze. Musisz wyjść ze środowiska Visual Studio IDE, otworzyć eksplorator Windows, przejść do katalogu obszaru roboczego ... dokumenty \ visualstudio xxx \ nazwa_rozwiązania \ nazwa_pakietu wybierz plik lub folder, kliknij prawym przyciskiem myszy i „usuń” plik lub folder.
  3. Kiedy ponownie wejdziesz do IDE i wybierzesz otwarte rozwiązanie lub otwórz pakiet / rozwiązanie, stare pliki i nazwy rozwiązań / pakietów znikną, podobnie jak ich mylące instrukcje ścieżki, które oszukują kompilator i analizator kodu, aby spojrzeli na stary katalog, nawet jeśli został zmieniony nazwa pliku i zmieniła nazwę projektu, nie zmienia to ścieżki katalogu.

Microsoft naprawdę musi naprawić ten problem, abyś mógł intuicyjnie tworzyć to, co większość ludzi chce utworzyć jako nowe pliki w tych samych katalogach, i usuwać rozwiązania, wybierając je i usuwając je z IDE. Początkujący są tak sfrustrowani, że instrukcje ścieżki katalogu są tak elastyczne dla doświadczonych programistów, ale tak niesprawiedliwe dla nowych programistów w ich domyślnych ustawieniach.

Mam nadzieję, że to naprawdę pomoże wam nowym chłopcom i powstrzyma doświadczonych programistów przed udzielaniem złych odpowiedzi, które nie działają dla was. Zakładają, że już rozumiesz instrukcje ścieżki i po prostu chcesz wpisać właściwy kod ... i właśnie dlatego tunel próbuje poprawić kod, ale nie pomaga w rozwiązaniu problemu. Jest to prawdopodobnie najczęstszy problem nieustannie opisywany w przepływie stosów z błędnymi odpowiedziami, które nie działają dla nowych programistów.

mwh
źródło
Podsumowując tę ​​odpowiedź (dla VS 2017): kliknij prawym przyciskiem myszy P1 w eksploratorze rozwiązań >>> dodaj ... >>> odwołanie ... >>> Projekty >>> Rozwiązanie >>> Zaznacz pole wyboru P2.
pasztet
7

Pierwszym krokiem jest utworzenie odniesienia P2 do P1, wykonując następujące czynności

  • Kliknij prawym przyciskiem myszy projekt i wybierz „Dodaj odniesienie”
  • Przejdź do zakładki Projekty
  • Wybierz P1 i naciśnij OK

Następnie musisz się upewnić, że klasy w P1 są dostępne dla P2. Najłatwiej je zrobić public.

public class MyType { ... }

Teraz powinieneś móc ich używać w P2 za pomocą ich w pełni kwalifikowanej nazwy. Zakładając, że przestrzeń nazw P1 to Project1, wtedy zadziałaby następująca

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

Jednak preferowanym sposobem jest dodanie użycia dla, Project1aby można było używać typów bez kwalifikacji

using Project1;
...

public void Example() {
  MyType obj = new MyType();
}
JaredPar
źródło
5

Jeśli masz dwa projekty w jednym folderze rozwiązania, po prostu dodaj odniesienie projektu do innego. Używając Namespace, możesz uzyskać klasy. Podczas tworzenia obiektu dla tej wymaganej klasy. Wywołaj metodę, którą chcesz.

Pierwszy projekt:

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

Tutaj dodaj odniesienie do Drugiego Projektu

Drugi projekt:

class SeccondClass
{
    FirstProject.FirstClass obj=new FirstProject.FirstClass();
    obj.Name();
}
Hemant Kumar
źródło
4

W projekcie P1 upublicznij klasę (jeśli jeszcze nie jest). Następnie dodaj odniesienie do projektu (zamiast odniesienia do pliku, błąd, na który się czasami natknąłem) do P2. Dodaj instrukcję using w P2 we właściwym miejscu i zacznij używać klasy od P1.

(Aby wspomnieć o tym: Alternatywą dla upublicznienia klasy byłoby uczynienie P2 przyjacielem P1. Jest to jednak mało prawdopodobne, aby była to odpowiedź, której szukasz, ponieważ miałoby to pewne konsekwencje. Więc trzymaj się powyższej sugestii.)

Manfred
źródło
2

Powiedz, że Twoja klasa w projekcie 2 nazywa się MyClass.

Oczywiście najpierw odnieś swój projekt 2 do odniesień w projekcie 1

using namespaceOfProject2;

// for the class calling bit:

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

więc ilekroć chcesz odwołać się do tej klasy, wpisz project2Class. Dodatkowo upewnij się, że zajęcia są również publiczne.

Connor
źródło
1

Miałem problem z różnymi platformami docelowymi.

Robiłem wszystko dobrze, ale po prostu nie mogłem użyć odniesienia w P2. Po tym, jak ustawiłem ten sam docelowy framework dla P1 i P2, działało to jak urok.

Mam nadzieję, że to komuś pomoże

Vitalie Belinschi
źródło
Miałem ten sam problem, z błędami takimi jak The name ... does not exist in the current context. Cannot resolve symbol ...do czasu zmiany ram docelowych projektów, aby pasowały. (Kliknij projekt prawym przyciskiem myszy i przejdź do, Project -> Properties -> Target frameworkaby to zmienić.)
sonny