So verwenden Sie eine Klasse aus einem C # -Projekt mit einem anderen C # -Projekt

110

In der gleichen Lösung habe ich zwei Projekte: P1 und P2. Wie kann ich eine Klasse von P1 in P2 verwenden?

Strider007
quelle
Sehr ähnliche Frage hier
RBT

Antworten:

65

Fügen Sie einfach einen Verweis auf P1 von P2 hinzu

Nissim
quelle
12
Dies funktioniert nicht, wenn die Klasse nicht öffentlich ist oder wenn P2 ein Freund von P1 ist.
Manfred
7
In diesem Fall haben Sie 3 Optionen: 1) Kombinieren Sie die 2 Projekte. 2) Machen Sie die Klasse intern - und fügen Sie P2 als "InternalsVisibleTo" -Attribut hinzu (weitere Informationen hier: msdn.microsoft.com/en-us/library/… ). 3) Wenn keines der oben genannten Schritte ausgeführt werden kann, müssen Sie die Reflexion verwenden, um die Klasse P1 von P2
Nissim
21
Ich hätte eine ausführlichere Antwort vorgezogen. Dieser fühlt sich fast sarkastisch an.
Shteeven
5
Ein Beispiel wäre besser gewesen.
Paul Alexander
1
Außerdem müssen beide Projekte auf dasselbe .NET-Framework abzielen. Überprüfen Sie die Eigenschaften jedes Projekts auf der Registerkarte "Anwendung". Es sollte ein "Ziel-Framework" vorhanden sein. Beide Projekte müssen hier auf den gleichen Rahmen abzielen.
Travis
192
  1. Erweitern Sie in der Struktur 'Projektmappen-Explorer' das P2-Projekt, klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie im Menü die Option 'Referenz hinzufügen'.
  2. Wählen Sie im Dialogfeld "Referenz hinzufügen" die Registerkarte "Projekte" und anschließend Ihr P1-Projekt.
  3. Wenn Sie Namespaces verwenden, müssen Sie die Namespaces für Ihre P1-Typen importieren, indem Sie Ihren Dateien in P2 'using'-Anweisungen hinzufügen.

Beachten Sie, dass die Typen in P1, auf die Sie direkt zugreifen möchten, eine ausreichende Zugriffsebene haben müssen. In der Regel bedeutet dies, dass sie veröffentlicht werden müssen.

Paul Ruane
quelle
Exzellenter Rat, Sir. Früher habe ich Links eingefügt, aber dann musste ich sie jedes Mal aktualisieren, wenn ich den Pfad einer Datei änderte. Mit einer Projektreferenz ist alles viel einfacher. Danke dir!
IneedHelp
2
Was ist, wenn Sie bereits einen Verweis auf P2 in P1 haben?
Wenn Sie dies
4
@colmde ja das würde es. Sie müssten die Elemente, die Sie teilen möchten, in ein drittes Projekt abstrahieren, das Sie einfallsreich als P3 bezeichnen könnten, auf das die beiden anderen Projekte verweisen.
Paul Ruane
Als Nicht-NET-Entwickler denke ich wirklich, dass dies die akzeptierte Antwort sein sollte ... Danke Paul (x2)
thisIsTheFoxe
16

Paul Ruane hat recht, ich habe gerade versucht, das Projekt aufzubauen. Ich habe gerade eine ganze SLN erstellt, um zu testen, ob es funktioniert.

Ich habe das in VC # VS2008 gemacht

<< (Ich helfe nur anderen Leuten, die dies lesen, mit () Kommentaren)

Schritt 1:

Machen Sie eine Lösung namens DoubleProject

Schritt 2:

Projekt in Lösung mit dem Namen DoubleProjectTwo erstellen (dazu die Lösungsdatei auswählen, Rechtsklick -> Hinzufügen -> Neues Projekt)

Ich habe jetzt zwei Projekte in der gleichen Lösung

Schritt 3:

Wie Paul Ruane sagte. Gehen Sie zu Referenzen im Lösungs-Explorer (wenn geschlossen, befindet es sich auf der Registerkarte Ansicht des Compilers). DoubleProjectTwo ist dasjenige, das Funktionen / Methoden von DoubleProject benötigt, also in DoubleProjectTwo mit der rechten Maustaste dort -> Hinzufügen -> Projekte -> DoubleProject.

Schritt 4:

Fügen Sie die Direktive für den Namespace ein:

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

Schritt 5:

Lassen Sie mir einen Ergebnisnachweis zeigen:

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

Die Haupt

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

Das sollte den Trick machen

Hoffe das hilft

EDIT ::: whoops hat den Methodenaufruf vergessen, um den String tatsächlich zu ändern, mach nicht dasselbe :)

Proclyon
quelle
9

Allzu oft stellt ein neuer Entwickler diese einfache Frage, die speziell bei Visual Studio-IDEs häufig auftritt. Nur wenige Menschen beantworten die spezifische Frage und kritisieren die Frage häufig oder geben "Vermutungen" für Lösungen an, die die allgemeinen Probleme nicht beantworten. Das erste häufig auftretende Problem ist, dass Sie mit der IDE neue Projekte erstellen, anstatt der vorhandenen Lösung neue Dateien (.java, .py, .cpp, .c) hinzuzufügen (standardmäßig wird eine neue Lösung erstellt), es sei denn, Sie ändern den Projektnamen und zur aktuellen Lösung hinzufügen. Dieses Problem tritt bei Python-, Java-, C # -, C ++ - und C-Projektordnern auf.

Dies ist nicht der Fall, wenn Sie ein anderes Projekt mit den Befehlen new> project> project type der IDE hinzufügen. Das Problem hierbei ist, dass das neue Projekt in einem anderen Verzeichnis als die vorhandenen Client- oder Benutzeroberflächen-Codedateien gespeichert wird. Um eine neue "Datei" im selben Projektbereich anstatt in einem neuen Projekt zu erstellen, muss der Anfänger Folgendes tun, was Microsoft nicht für Sie tut und Sie sogar von dem intuitiv Offensichtlichen in die Irre führt.

  1. Wählen Sie die "Anwendung" aus, in die Sie das neue Verhalten importieren möchten (aus einer anderen Datei).
  2. Wählen Sie Projekt> Neues Element hinzufügen
  3. Wählen Sie den "Programmdateivorlagentyp" aus, z. B. "filetype.py", "filetype.java", "filetype.c", "filetype.cpp", "filetype.C #" usw. oder einen Dateityp für eine Bibliotheksklasse (etwas anderes als die Optionen für die Startdatei, die Sie beim Erstellen sehen ein neues Anwendungsprojekt oder ein neues Bibliotheksprojekt erstellen).
  4. In Ihrem Projekt wird ein neuer Dateiname mit Standardname erstellt.
  5. Ändern Sie den Standardnamen der Datei in "library.py" oder "façade.java" usw.

JETZT funktionieren die Codeempfehlungen zum Importieren von Bibliotheken oder zum Verwenden von Namespaces wie in den obigen Kommentaren beschrieben, und Sie müssen weder Pfadanweisungen noch Lösungspfade und Lösungsnamen ändern, die Microsoft nicht einfach ändern lässt (dh Sie können die ändern Dateinamen oder Projektnamen, aber die IDE ändert den Projektpfad oder die Lösungspfadnamen nicht automatisch.

Das Folgende ist ein Python-Beispiel, funktioniert jedoch ähnlich für C #, Java oder C / C ++ unter Verwendung der Includes, Namespaces oder unter Verwendung von Codebefehlen, die für jede Sprache geeignet sind, um Code in anderen Klassen / Projekten im SAME DIRECTORY SPACE zu finden.

Die Anwendungsdatei "Hallo Welt", die aus anderen Codedateien im selben Verzeichnis importiert wird.

Beachten Sie, dass die Python-Leerzeichen-Trennzeichen in diesem Stackoverflow-Kommentareditor nicht korrekt platziert werden:

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

Die Bibliotheksdatei oder "Fassadendatei" mit Klassen, Methoden oder Funktionen, die Sie importieren möchten.

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

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

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


pass

JETZT, wie lösen Sie das Chaos, in das Sie die IDE führt? Um Code aus einer anderen Datei im selben Verzeichnisbereich zu importieren, fügen Sie einen Verweis darauf hinzu.

  1. Wählen Sie die Anwendungsdatei aus
  2. Wählen Sie Projekt> Referenz hinzufügen
  3. Wählen Sie den Dateinamen, der mit dem richtigen Verzeichnispfad angezeigt wird (überprüfen Sie ihn).
  4. Die Referenz steht nun dem Interpreter, der Codeprüfung und / oder dem Compiler zur Verfügung.

OK, nachdem Sie dieses Problem gelöst haben, wie können Sie wirklich zwei separate Projekte im selben Lösungsbereich miteinander verbinden?

  1. Sie müssen sowohl zu den Indexer- oder "Intellisense" -Optionen als auch zum Compiler / Interpreter gehen und die Verzeichnispfadanweisungen physisch überprüfen oder ändern / hinzufügen, wenn sie etwas anderes sind als das, was auf Ihr "zweites" Projekt oder Ihren Lösungsbereich verweist. Wenn Sie den Pfad ändern oder die Pfadvariablen zu Ihrem Arbeitsbereich und zu den spezifischen Speicherorten der Projekte ändern, bei denen es sich um unterschiedliche Verzeichnisbereiche handelt, können der Compiler und der Code-Analysator diese Bibliotheken, headers.h, Namespaces, Projekt- oder Dateispeicherorte finden.
  2. Es ist noch schlimmer, alte Projekte zu entfernen, die Sie versehentlich erstellt haben. Sie müssen die Visual Studio-IDE beenden, den Windows Explorer öffnen, in das Arbeitsbereichsverzeichnis wechseln ... Dokumente \ Visualstudio xxx \ Lösungsname \ Paketname Wählen Sie die Datei oder den Ordner aus, klicken Sie mit der rechten Maustaste und "löschen" Sie die Datei oder den Ordner.
  3. Wenn Sie die IDE erneut eingeben und "Lösung öffnen" oder "Paket / Lösung öffnen" auswählen, werden die alten Dateien und Lösungs- / Paketnamen sowie die irreführenden Pfadanweisungen gelöscht, die den Compiler und den Codeanalysator täuschen, das alte Verzeichnis anzuzeigen, obwohl Sie es geändert haben den Dateinamen und den Projektnamen geändert, ändert es nicht den Verzeichnispfad mit.

Microsoft muss dieses Problem wirklich beheben, damit Sie intuitiv erstellen können, was die meisten Benutzer als neue Dateien in denselben Verzeichnissen erstellen möchten, und Lösungen entfernen können, indem Sie sie auswählen und aus der IDE löschen. Anfänger sind so frustriert über Verzeichnispfadanweisungen, die für erfahrene Entwickler so flexibel, für neue Entwickler jedoch in ihren Standardeinstellungen so unfair sind.

Ich hoffe, dies hilft Ihnen wirklich neuen Leuten und verhindert, dass erfahrene Entwickler Ihnen die falschen Antworten geben, die für Sie nicht funktionieren. Sie gehen davon aus, dass Sie die Pfadanweisungen bereits verstehen und nur den richtigen Code eingeben möchten. Aus diesem Grund versucht der Tunnel, Ihren Code zu korrigieren, hilft Ihnen jedoch nicht, das Problem zu beheben. Dies ist wahrscheinlich das häufigste Problem, das im Stackoverflow ständig mit falschen Antworten beschrieben wird, die für neue Programmierer nicht funktionieren.

mwh
quelle
Um diese Antwort zusammenzufassen (für VS 2017): Klicken Sie im Lösungs-Explorer mit der rechten Maustaste auf P1 >>> hinzufügen ... >>> Referenz ... >>> Projekte >>> Lösung >>> Aktivieren Sie das Kontrollkästchen P2.
Andrew Pate
7

Der erste Schritt besteht darin, P2 als Referenz P1 zu verwenden, indem Folgendes ausgeführt wird

  • Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie "Referenz hinzufügen".
  • Gehen Sie zur Registerkarte Projekte
  • Wählen Sie P1 und klicken Sie auf OK

Als nächstes müssen Sie sicherstellen, dass die Klassen in P1 für P2 zugänglich sind. Der einfachste Weg ist, sie zu machen public.

public class MyType { ... }

Jetzt sollten Sie sie in P2 über ihren vollständig qualifizierten Namen verwenden können. Angenommen, der Namespace von P1 ist Project1, dann würde Folgendes funktionieren

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

Der bevorzugte Weg ist jedoch, eine Verwendung für hinzuzufügen, Project1damit Sie die Typen ohne Qualifikation verwenden können

using Project1;
...

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

Wenn Sie zwei Projekte in einem Lösungsordner haben. Fügen Sie einfach die Referenz des Projekts in einen anderen ein. Verwenden Sie den Namespace, um die Klassen abzurufen. Beim Erstellen des Objekts dafür die erforderliche Klasse. Rufen Sie die gewünschte Methode auf.

Erstes Projekt:

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

Fügen Sie hier einen Verweis auf das zweite Projekt hinzu

Zweites Projekt:

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

Machen Sie im Projekt P1 die Klasse öffentlich (falls noch nicht geschehen). Fügen Sie dann P2 eine Projektreferenz hinzu (anstelle einer Dateireferenz, ein Fehler, auf den ich gelegentlich gestoßen bin). Fügen Sie an der richtigen Stelle eine using-Anweisung in P2 hinzu und beginnen Sie mit der Verwendung der Klasse ab P1.

(Um dies zu erwähnen: Die Alternative zur Veröffentlichung der Klasse wäre, P2 zu einem Freund von P1 zu machen. Dies ist jedoch wahrscheinlich nicht die Antwort, nach der Sie suchen, da dies einige Konsequenzen hätte. Halten Sie sich also an den obigen Vorschlag.)

Manfred
quelle
2

Angenommen, Ihre Klasse in Projekt 2 heißt MyClass.

Verweisen Sie dann zuerst auf Ihr Projekt 2 unter Verweise in Projekt 1

using namespaceOfProject2;

// for the class calling bit:

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

Wenn Sie also auf diese Klasse verweisen möchten, geben Sie project2Class ein. Stellen Sie außerdem sicher, dass die Klasse auch öffentlich ist.

Connor
quelle
1

Ich hatte ein Problem mit verschiedenen Ziel-Frameworks.

Ich habe alles richtig gemacht, konnte aber die Referenz in P2 einfach nicht verwenden. Nachdem ich das gleiche Ziel-Framework für P1 und P2 festgelegt hatte, funktionierte es wie ein Zauber.

Hoffe es wird jemandem helfen

Vitalie Belinschi
quelle
Ich hatte das gleiche Problem mit Fehlern, z. B. The name ... does not exist in the current context. Cannot resolve symbol ...bis ich die Ziel-Frameworks der Projekte entsprechend geändert habe. (Klicken Sie mit der rechten Maustaste auf das Projekt und gehen Sie zu Project -> Properties -> Target framework, um dies zu ändern.)
sonny