Comment utiliser une classe d'un projet C # avec un autre projet C #

110

Dans la même solution, j'ai deux projets: P1 et P2. Comment puis-je utiliser une classe de P1 dans P2?

Strider007
la source
Question très similaire ici
RBT

Réponses:

65

Ajoutez simplement la référence à P1 depuis P2

Nissim
la source
12
Cela ne fonctionnera pas si la classe n'est pas publique ou si P2 est un ami de P1.
Manfred
7
Dans ce cas, vous avez 3 options: 1) Combinez les 2 projets 2) Rendez la classe interne - et ajoutez P2 comme attribut "InternalsVisibleTo" (plus d'informations ici: msdn.microsoft.com/en-us/library/… ). 3) Si rien de ce qui précède ne peut être fait - vous devrez utiliser la réflexion pour instancier et invoquer la classe P1 à partir de P2
Nissim
21
J'aurais préféré une réponse plus élaborée. Celui-ci est presque sarcastique.
shteeven
5
Un exemple aurait été mieux.
Paul Alexander
1
En outre, les deux projets doivent cibler le même framework .NET. Vérifiez les propriétés de chaque projet dans l'onglet «Application», il devrait y avoir un «Cadre cible». Les deux projets doivent cibler le même cadre ici.
Travis
194
  1. Dans l'arborescence «Explorateur de solutions», développez le projet P2, puis cliquez avec le bouton droit sur le projet et sélectionnez «Ajouter une référence» dans le menu.
  2. Dans la boîte de dialogue «Ajouter une référence», sélectionnez l'onglet «Projets» et sélectionnez votre projet P1.
  3. Si vous utilisez des espaces de noms, vous devrez importer les espaces de noms pour vos types P1 en ajoutant des instructions «using» à vos fichiers dans P2.

Notez que les types de P1 auxquels vous souhaitez accéder directement doivent avoir un niveau d'accès suffisant: cela signifie généralement qu'ils doivent être rendus publics.

Paul Ruane
la source
Excellent conseil, monsieur. J'avais l'habitude de coller des liens, mais je devais ensuite les mettre à jour chaque fois que je changeais le chemin d'un fichier. Avec une référence de projet, tout est beaucoup plus facile. Je vous remercie!
IneedHelp
2
Et si vous avez déjà une référence à P2 dans P1? Faire ce qui précède créerait une "dépendance circulaire" ...
colmde
4
@colmde oui. Vous devrez résumer les éléments que vous souhaitez partager dans un troisième projet, que vous pourriez nommer de manière imaginative P3, qui est référencé par les deux autres projets.
Paul Ruane
En tant que développeur non-NET, je pense vraiment que cela devrait être la réponse acceptée ... Merci Paul (x2)
thisIsTheFoxe
16

Paul Ruane a raison, je viens de m'essayer à la construction du projet. Je viens de faire un SLN entier pour tester si cela fonctionnait.

J'ai fait ça dans VC # VS2008

<< (Juste aider les autres personnes qui lisent ceci aussi avec () commentaires)

Étape 1:

Créer une solution appelée DoubleProject

Étape 2:

Créer un projet dans une solution nommée DoubleProjectTwo (pour ce faire, sélectionnez le fichier de solution, clic droit -> Ajouter -> Nouveau projet)

J'ai maintenant deux projets dans la même solution

Étape 3:

Comme l'a déclaré Paul Ruane. aller aux références dans l'explorateur de solutions (s'il est fermé, il est dans l'onglet vue du compilateur). DoubleProjectTwo est celui qui a besoin des fonctions / méthodes de DoubleProject, donc dans DoubleProjectTwo, faites référence à la souris avec le bouton droit de la souris -> Ajouter -> Projets -> DoubleProject.

Étape 4:

Incluez la directive pour l'espace de noms:

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

Étape 5:

Faites quelque chose pour me montrer la preuve des résultats:

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

Le principal

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

Cela devrait faire l'affaire

J'espère que cela t'aides

EDIT ::: whoops oublié l'appel de méthode pour changer réellement la chaîne, ne faites pas la même chose :)

Proclyon
la source
9

Trop souvent, un nouveau développeur pose cette question simple qui est un problème courant spécifiquement avec les IDE de Visual Studio. Peu de gens répondent à la question spécifique et critiquent souvent la question ou donnent des «suppositions» pour des solutions qui ne répondent pas aux problèmes courants. Le premier problème courant est que l'EDI vous amène à créer de nouveaux projets plutôt qu'à ajouter de nouveaux fichiers (.java, .py, .cpp, .c) à la solution existante (par défaut, il crée une nouvelle solution) sauf si vous changez le nom du projet et ajouter à la solution actuelle. Ce problème se produit pour les dossiers de projet Python, java, c #, C ++ et C.

Cela ne se produit pas lorsque vous ajoutez un autre projet à l'aide des commandes de type nouveau> projet> projet de l'EDI. Le problème ici est que le nouveau projet est stocké dans un répertoire différent de celui des fichiers de code d'interface client ou utilisateur existants. Pour créer un nouveau "fichier" dans le même espace de projet plutôt qu'un nouveau projet, le débutant doit effectuer les opérations suivantes que Microsoft ne fera pas pour vous et vous éloigne même de l'évidence intuitive par défaut.

  1. Sélectionnez "l'application" dans laquelle vous souhaitez importer le nouveau comportement (à partir d'un autre fichier)
  2. Sélectionnez un projet> ajouter un nouvel élément
  3. Sélectionnez le "type de modèle de fichier programme" tel que filetype.py, filetype.java, filetype.c, filetype.cpp, filetype.C #, etc. ou un type de fichier de classe de bibliothèque (autre chose que les options de fichier de démarrage que vous voyez lorsque vous créez un nouveau projet d'application ou créer un nouveau projet de bibliothèque).
  4. Un nouveau nom de fichier avec le nom par défaut est créé dans votre projet.
  5. Changez le nom par défaut du fichier en quelque chose comme library.py ou façade.java, etc.

MAINTENANT, les recommandations de code pour importer des bibliothèques ou utiliser des espaces de noms fonctionneront comme décrit dans les commentaires ci-dessus et vous n'avez pas à modifier les instructions de chemin ou les chemins de solutions et les noms de solutions que Microsoft ne vous permettra pas de modifier facilement (c'est-à-dire que vous pouvez modifier le les noms de fichiers ou les noms de projet mais l'EDI ne changera pas automatiquement le chemin du projet ou les noms du chemin de la solution).

Ce qui suit est un exemple Python mais fonctionne de manière similaire pour C #, java ou C / C ++ en utilisant les includes, les espaces de noms ou en utilisant les commandes de code appropriées à chaque langage pour trouver du code dans d'autres classes / projets dans le MÊME ESPACE DE RÉPERTOIRE.

Le fichier d'application "hello world" importé à partir d'autres fichiers de code dans le même répertoire.

Notez que les délimiteurs d'espaces blancs python ne s'espacent pas correctement dans cet éditeur de commentaires 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

Le fichier bibliothèque ou fichier "façade" contenant les classes, méthodes ou fonctions que vous souhaitez importer.

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

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

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


pass

MAINTENANT, comment résolvez-vous réellement le désordre dans lequel l'EDI vous entraîne? Pour importer du code à partir d'un autre fichier dans le même espace de répertoire, ajoutez une référence à celui-ci.

  1. Sélectionnez le dossier de candidature
  2. Sélectionnez Projet> ajouter une référence
  3. Choisissez le nom de fichier visible avec le bon chemin de répertoire (vérifiez-le)
  4. La référence est maintenant disponible pour l'interpréteur, le vérificateur de code et / ou le compilateur.

OK, alors maintenant que ce problème est résolu, comment liez-vous vraiment deux projets distincts dans le même espace de solution?

  1. Vous devez aller à la fois aux options d'indexeur ou "intellisense" et au compilateur / interprète et vérifier physiquement ou modifier / ajouter les instructions de chemin de répertoire si elles sont autre chose que ce qui pointe vers votre "deuxième" espace de projet ou de solution. Lorsque vous modifiez le chemin ou modifiez les variables de chemin vers votre espace de travail et vers les emplacements spécifiques des projets qui sont des espaces de répertoire différents, le compilateur et l'analyseur de code peuvent alors trouver ces bibliothèques, headers.h, espaces de noms, emplacements de projet ou de fichier.
  2. Pour supprimer les anciens projets que vous avez créés par erreur, c'est encore pire. Vous devez quitter l'IDE de Visual Studio, ouvrir l'explorateur Windows, aller dans le répertoire de l'espace de travail ... documents \ visualstudio xxx \ solutionname \ packagename sélectionnez le fichier ou le dossier, cliquez avec le bouton droit et "supprimer" le fichier ou le dossier.
  3. Lorsque vous entrez à nouveau dans l'EDI et sélectionnez une solution ouverte ou un package / solution ouvert, les anciens fichiers et les noms de solution / package ont disparu, tout comme leurs instructions de chemin trompeuses qui trompent le compilateur et l'analyseur de code pour regarder l'ancien répertoire même si vous avez changé le nom de fichier et changé le nom du projet, il ne change pas le chemin du répertoire avec lui.

Microsoft a vraiment, vraiment besoin de résoudre ces problèmes afin que vous puissiez créer intuitivement ce que la plupart des gens veulent créer en tant que nouveaux fichiers dans les mêmes répertoires et supprimer des solutions en les sélectionnant et en les supprimant de l'EDI. Les débutants sont tellement frustrés par les instructions de chemin de répertoire si flexibles pour les développeurs chevronnés, mais si injustes pour les nouveaux développeurs par défaut.

J'espère que cela vous aide vraiment les nouveaux et empêche les développeurs chevronnés de vous donner les mauvaises réponses qui ne fonctionnent pas pour vous. Ils supposent que vous comprenez déjà les instructions de chemin et que vous voulez simplement taper le bon code ... c'est aussi pourquoi le tunnel essaie de corriger votre code mais ne vous aide pas à résoudre le problème. C'est probablement le problème le plus courant décrit en permanence sur stackoverflow avec de mauvaises réponses qui ne fonctionnent pas pour les nouveaux programmeurs.

mwh
la source
Pour résumer cette réponse (pour VS 2017): clic droit sur P1 dans l'explorateur de solutions >>> ajouter ... >>> référence ... >>> Projets >>> Solution >>> Cochez la case P2.
andrew pate
7

La première étape consiste à faire référence P2 P1 en procédant comme suit

  • Faites un clic droit sur le projet et sélectionnez "Ajouter une référence"
  • Allez dans l'onglet Projets
  • Sélectionnez P1 et appuyez sur OK

Ensuite, vous devrez vous assurer que les classes de P1 sont accessibles à P2. Le moyen le plus simple est de les fabriquer public.

public class MyType { ... }

Vous devriez maintenant pouvoir les utiliser en P2 via leur nom complet. En supposant que l'espace de noms de P1 est Project1, alors ce qui suit fonctionnerait

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

La méthode préférée est cependant d'ajouter une utilisation pour Project1afin que vous puissiez utiliser les types sans qualification

using Project1;
...

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

Si vous avez deux projets dans un dossier de solution, ajoutez simplement la référence du projet dans un autre, en utilisant l'espace de noms, vous pouvez obtenir les classes. Lors de la création de l'objet pour cela, la classe requise. Appelez la méthode que vous voulez.

Premier projet:

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

Ajoutez ici une référence au deuxième projet

Deuxième projet:

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

Dans le projet P1, rendez la classe publique (si ce n'est déjà fait). Ajoutez ensuite une référence de projet (plutôt qu'une référence de fichier, une erreur que j'ai rencontrée occasionnellement) à P2. Ajoutez une instruction using dans P2 au bon endroit et commencez à utiliser la classe de P1.

(Pour mentionner ceci: l'alternative à rendre la classe publique serait de faire de P2 un ami de P1. Cependant, il est peu probable que ce soit la réponse que vous recherchez car cela aurait des conséquences. Alors, restez fidèle à la suggestion ci-dessus.)

Manfred
la source
2

Supposons que votre classe dans le projet 2 s'appelle MyClass.

Evidemment, commencez par référencer votre projet 2 sous les références du projet 1 puis

using namespaceOfProject2;

// for the class calling bit:

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

Ainsi, chaque fois que vous souhaitez référencer cette classe, vous tapez project2Class. De plus, assurez-vous que cette classe est également publique.

Connor
la source
1

J'ai eu un problème avec différents frameworks cibles.

Je faisais tout correctement, mais je ne pouvais tout simplement pas utiliser la référence en P2. Après avoir défini le même cadre cible pour P1 et P2, cela a fonctionné comme un charme.

J'espère que cela aidera quelqu'un

Vitalie Belinschi
la source
J'ai eu le même problème, avec des erreurs telles que The name ... does not exist in the current context. Cannot resolve symbol ...jusqu'à ce que je change les cadres cibles des projets pour qu'ils correspondent. (Cliquez avec le bouton droit sur le projet et accédez à Project -> Properties -> Target frameworkpour changer cela.)
sonny