web-dev-qa-db-fra.com

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

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

99
Strider007

Ajoutez simplement une référence à P1 à partir de P2

65
Nissim
  1. Dans l'arborescence de "l'Explorateur de solutions", développez le projet P2, puis cliquez dessus avec le bouton droit de la souris 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", puis sélectionnez votre projet P1.
  3. Si vous utilisez des espaces de noms, vous devrez importer les espaces de noms de vos types P1 en ajoutant des instructions "using" à vos fichiers en P2.

Notez que les types dans 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.

168
Paul Ruane

Paul Ruane a raison, je viens d’essayer moi-même de construire le projet. Je viens de faire un SLN entier pour tester si cela fonctionnait.

Je l'ai fait dans VC # VS2008

<< (J'aide simplement les autres lecteurs qui lisent ceci avec des commentaires ())

Étape 1:

Faire une solution appelée DoubleProject

Étape 2:

Créer un projet dans la solution nommé DoubleProjectTwo (pour ce faire, sélectionnez le fichier de solution, cliquez avec le bouton droit de la souris sur -> Ajouter -> Nouveau projet.)

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

Étape 3:

Comme Paul Ruane a déclaré. Accédez aux références dans l'explorateur de solutions (s'il est fermé, il se trouve dans l'onglet Vue du compilateur). DoubleProjectTwo est celui qui a besoin des fonctions/méthodes de DoubleProject donc dans DoubleProjectTwo, il y a une référence de souris droite -> Ajouter -> Projets -> DoubleProject.

Étape 4:

Incluez la directive pour l'espace de nom:

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:

Faites quelque chose 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 a oublié l'appel à la méthode pour changer la chaîne, ne faites pas la même chose :)

13
Proclyon

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

Le nouveau développeur qui sélectionne "nouveau> projet> nom du projet et modifie le répertoire de la solution en" utiliser la même solution "crée un nouveau" projet "dans le même espace de solution, mais pas dans le même espace de répertoire que le fichier d'interface utilisateur ou la commande en cours. fichier en ligne qui pose toujours des problèmes avec les erreurs "package non trouvé" lors de la construction et de l'exécution du projet ou de la solution. C'est pourquoi les suggestions de codage ci-dessus pour importer des packages, des classes, des méthodes et des fonctions fonctionnent uniquement (et ne répondent donc pas à la question ) lorsque le fichier "library" ou le fichier "comportement distinct" se trouve non seulement dans le même chemin de répertoire de solution, mais également dans le même espace de répertoire d'application "interface utilisateur" ou "de shell de commande". Cela ne se produit pas lorsque vous ajoutez un autre projet utilisant les nouvelles commandes> projet> type de 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 th un nouveau projet dont le débutant a besoin doit faire ce que Microsoft ne fera pas pour vous et vous induit même en erreur par rapport à ce qui est intuitivement évident par défaut.

  1. Sélectionnez l'application dans laquelle vous souhaitez importer le nouveau comportement (à partir d'un autre fichier).
  2. Sélectionner 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 que les options de fichier de démarrage que vous voyez lors de la création). un nouveau projet d’application ou créer un nouveau projet de bibliothèque).
  4. Un nouveau nom de fichier avec un nom par défaut est créé dans votre projet.
  5. Remplacez le nom par défaut du fichier par 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’aurez pas à changer les instructions de chemin ou les solutions et les noms de solutions que Microsoft ne vous laissera pas changer facilement. les noms de fichiers ou les noms de projets mais IDE ne changera pas automatiquement le chemin du projet ni les noms des chemins de la solution).

Voici un exemple Python mais fonctionne de la même manière pour C #, Java ou C/C++ en utilisant les inclus, les espaces de noms ou les commandes de code appropriées à chaque langage pour trouver du code dans d’autres classes/projets de la MÊME ESPACE RÉPERTOIRE.

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

Notez que les délimiteurs d'espaces blancs python) ne vont pas correctement dans l'espace dans cet éditeur de commentaires:

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 de bibliothèque ou le fichier "façade" contenant les classes, méthodes ou fonctions à 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 IDE vous mène?) Pour importer du code à partir d'un autre fichier du même espace répertoire, vous ajoutez une référence à celui-ci.

  1. Sélectionnez le fichier d'application
  2. Sélectionnez Projet> Ajouter une référence.
  3. Choisissez le nom de fichier visible avec le chemin de répertoire correct (cochez-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 relie-t-on réellement deux projets distincts dans le même espace de solution?

  1. Vous devez accéder à la fois aux options de l'indexeur ou "intellisense" et du compilateur/interprète et vérifier physiquement ou modifier/ajouter les instructions de chemin de répertoire si elles sont différentes de ce qui pointe vers votre "deuxième" projet ou espace de solution. Lorsque vous modifiez le chemin ou changez les variables de chemin en votre espace de travail et en des emplacements spécifiques des projets qui sont des espaces de répertoires différents, le compilateur et l'analyseur de code peuvent ensuite 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'EDI de Visual Studio, ouvrir l'explorateur Windows, accéder au répertoire de l'espace de travail ... documents\visualstudio xxx\solutionname\packagename sélectionner le fichier ou le dossier, cliquer à l'aide du bouton droit de la souris et "supprimer" le fichier ou le dossier.
  3. Lorsque vous entrez à nouveau le IDE et sélectionnez solution ouverte ou package/solution ouvert), les anciens fichiers et les noms de solution/package ont disparu, de même que leurs instructions de chemin trompeuses qui trompent le compilateur et l'analyseur de code. regardez l'ancien répertoire même si vous avez changé le nom du fichier et le nom du projet, cela ne change pas le chemin du répertoire.

Microsoft a vraiment, vraiment besoin de résoudre ce problème 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 déclarations de chemin de répertoire si souples pour les développeurs chevronnés, mais tellement injustes envers les nouveaux développeurs par défaut.

J'espère que cela vous aide vraiment les nouveaux gars 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 souhaitez simplement taper le bon code ... ce qui explique également pourquoi le tunnel tente 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 continuellement sur stackoverflow avec des réponses erronées qui ne fonctionnent pas pour les nouveaux programmeurs.

7
mwh

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

  • Clic droit sur le projet et sélectionnez "Ajouter une référence"
  • Aller sur l'onglet Projets
  • Sélectionnez P1 et cliquez sur OK

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

public class MyType { ... }

Vous devriez maintenant pouvoir les utiliser en P2 via leur nom complet. En supposant que l’espace de nommage de P1 soit Project1, les éléments suivants fonctionneraient

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

La méthode préférée consiste toutefois à ajouter une utilisation de Project1 Afin que vous puissiez utiliser les types sans qualification.

using Project1;
...

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

Dans le projet P1, rendre 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 je rencontre occasionnellement) à P2. Ajoutez une instruction using dans P2 au bon endroit et commencez à utiliser la classe de P1.

(Pour mentionner ceci: l'alternative de 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 cherchez, car cela aurait des conséquences. Conservez donc la suggestion ci-dessus.)

4
Manfred

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

Évidemment, commencez par référencer votre projet 2 sous références dans le projet 1, puis

using namespaceOfProject2;

// for the class calling bit:

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

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

2
Connor

Si vous avez deux projets dans un dossier de solution.Il vous suffit d'ajouter la référence du projet dans un autre. À l'aide de l'espace de noms, vous pouvez obtenir les classes. While Création de l'objet pour cela, la classe requise. Appelez la méthode que vous voulez.

FirstProject:

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

Ici ajouter une référence au deuxième projet

SecondProject:

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

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

Je faisais bien les choses, 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é à merveille.

J'espère que ça va aider quelqu'un

1
Vitalie Belinschi