158 votes

Comment utiliser une classe d'un projet C# dans un autre projet C# ?

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

0 votes

Question très similaire ici

271voto

Paul Ruane Points 12840
  1. Dans l'arborescence de l'explorateur de solutions, développez le projet P2, puis cliquez avec le bouton droit de la souris 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 P2.

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

0 votes

Excellent conseil, monsieur. Avant, je collais des liens, mais je devais 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. Merci !

3 votes

Que faire si vous avez déjà une référence à P2 dans P1 ? Si vous faites ce qui précède, vous créez une "dépendance circulaire" ...

5 votes

@colmde oui c'est vrai. Il faudrait que vous fassiez abstraction des éléments que vous souhaitez partager dans un troisième projet, que vous pourriez intituler P3 de manière imaginative, et qui serait référencé par les deux autres projets.

69voto

Nissim Points 2174

Il suffit d'ajouter la référence à P1 à partir de P2

15 votes

Cela ne fonctionnera pas si la classe est non publique ou si P2 est un ami de P1.

7 votes

Dans ce cas, vous avez 3 options : 1) Combiner les 2 projets 2) Rendre la classe interne - et ajouter P2 comme attribut "InternalsVisibleTo" (plus d'informations ici : msdn.microsoft.com/fr/us/library/ ). 3) Si rien de ce qui précède ne peut être fait, vous devrez utiliser la réflexion pour instantaner et invoquer la classe P1 à partir de P2.

46 votes

J'aurais préféré une réponse plus élaborée. Celle-ci semble presque sarcastique.

19voto

Proclyon Points 343

Paul Ruane a raison, je viens d'essayer moi-même de construire le projet. J'ai juste fait un SLN entier pour tester si cela fonctionnait.

J'ai fait ceci en VC# VS2008

<< ( J'aide juste les autres personnes qui lisent ceci aussi bien avec des () commentaires )

Étape 1 :

Créer une solution appelée DoubleProject

Étape 2 :

Créez un projet dans la solution nommé DoubleProjectTwo (pour ce faire, sélectionnez le fichier de la solution, cliquez à droite --> Ajouter --> Nouveau projet).

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

Étape 3 :

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

Étape 4 :

Inclure la directive pour le 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();
        }
    }
}

Étape 5 :

Faites quelque chose montrez-moi une preuve de 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;
        }
    }
}

Les principaux

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 vous aidera

EDIT :: : oups, j'ai oublié l'appel de la méthode pour changer la chaîne de caractères, ne faites pas la même chose :)

8voto

JaredPar Points 333733

La première étape consiste à faire en sorte que P2 fasse référence à P1 en effectuant les opérations suivantes

  • Cliquez à droite sur le projet et sélectionnez "Ajouter une référence".
  • Allez dans l'onglet Projets
  • Sélectionnez P1 et cliquez sur OK

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

public class MyType { ... }

Vous devriez maintenant être en mesure de les utiliser dans P2 via leur nom pleinement qualifié. En supposant que l'espace de nom 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 de l'option Project1 afin que vous puissiez utiliser les types sans qualification

using Project1;
...

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

4voto

Manfred Points 2625

Dans le projet P1, rendez la classe publique (si elle ne l'est pas déjà). Ensuite, ajoutez 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. Restez donc avec la suggestion ci-dessus).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X