Comment partager du code entre des projets / solutions dans Visual Studio?

229

J'ai deux solutions qui ont un code commun, donc je voudrais l'extraire et le partager entre elles. De plus, j'aimerais pouvoir publier cette bibliothèque indépendamment car elle pourrait être utile à d'autres.

  • Quelle est la meilleure façon de le faire avec Visual Studio 2008?
  • Un projet est-il présent dans plusieurs solutions?
  • Ai-je une solution distincte pour le morceau de code séparé?
  • Une solution peut-elle dépendre d'une autre?
pupeno
la source
15
C'est 2014. Nuget est la réponse.
Ravi
1
@Ravi Je souhaitais modulariser une application Web Visual Studio développée dans mon bureau, mais lorsque j'essaie de penser à modulariser l'application Web Visual Studio en différentes applications Web, la dépendance circulaire entre les composants apparaît, ce qui est faux. Par exemple, je ne peut pas modulariser le projet POCO pour chacune des applications Web prévues car la dépendance est trop importante. Existe-t-il un moyen d'utiliser Nuget pour aider à la modularisation?
CS Lewis

Réponses:

70

Un projet peut être référencé par plusieurs solutions.

Mettez votre bibliothèque ou votre code principal dans un projet, puis référencez ce projet dans les deux solutions.

ilivewithian
la source
150
Ok mais comment? Quelques instructions?
cja
2
Cette (ancienne) réponse est incomplète en elle-même en raison de la multiplication des assemblages: cependant, lorsqu'elle est couplée à ILMerge - en particulier avec l'option internaliser - elle devient une solution très puissante.
user2246674
2
@ user2246674: pourquoi est-il incomplet à cause de plusieurs assemblages? Le PO n'a rien dit sur une seule assemblée.
John Saunders
1
@Jfly: renommer des choses qui ne sont pas visibles publiquement n'affectera pas le code extérieur. Renommer des choses qui sont visibles publiquement ne doit être fait que lorsque tous les projets utilisant le code commun, et le code commun lui-même, sont dans une seule solution. Vous pouvez créer manuellement des solutions «principales» qui contiennent tous ces projets et qui sont utilisées uniquement à cette fin.
John Saunders
1
Cela dépend de ce que vous entendez par une autre instance. Vous feriez probablement bien de commencer une nouvelle question avec plus de détails.
ilivewithian
248

Vous pouvez "lier" un fichier de code entre deux projets. Cliquez avec le bouton droit sur votre projet, choisissez Add-> Existing item, puis cliquez sur la flèche vers le bas à côté du Addbouton:

Capture d'écran

D'après mon expérience, la liaison est plus simple que la création d'une bibliothèque. Le code lié résulte en un seul exécutable avec une seule version.

Andomar
la source
9
Doux - c'est la réponse que je cherchais. Je ne voulais pas d'une collection de DLL. cheers
CAD bloke
63
Pourquoi le feriez-vous de cette façon? C'est pourquoi nous avons des bibliothèques, l'encapsulation. Je ne vois aucun sens commercial ou logique sur la raison pour laquelle vous feriez cela.
Ryan Ternier
16
De plus, vos liens peuvent ne pas être sous le même contrôle de source. C'est une suggestion très dangereuse.
Kugel
11
Il existe des situations où cette solution est utile. Par exemple, je développe dans InfoPath 2007 où il n'est pas simple de déployer une DLL distincte dans SharePoint. Afin de partager des fonctionnalités communes entre les formulaires InfoPath, l'approche du fichier de classe liée est très utile. Il est placé un niveau au-dessus des projets de formulaire individuels et tout est contrôlé à la source au niveau racine.
Oliver Gray
6
Comme autre exemple d'utilité, disons que vous développez deux applications qui doivent communiquer entre elles. L'un est 64 bits et l'autre 32, donc vous ne voulez pas nécessairement des dll séparés construits à partir du même code pour référencer chaque projet. De cette façon, vous pouvez imiter la fonctionnalité c de l'utilisation d'un fichier .h.
user912447
33

File > Add > Existing Project...vous permettra d'ajouter des projets à votre solution actuelle. J'ajoute simplement cela car aucun des messages ci-dessus ne le souligne. Cela vous permet d'inclure le même projet dans plusieurs solutions.

Aseem Kishore
la source
1
Cela fonctionne; à la baisse, il ne construit pas les deux projets en un seul assemblage.
Ian Boyd du
24

Vous pouvez inclure un projet dans plusieurs solutions. Je ne pense pas qu'un projet ait un concept de la solution dont il fait partie. Cependant, une autre alternative consiste à créer la première solution à un endroit bien connu et à référencer les binaires compilés. Cela présente l'inconvénient de nécessiter un peu de travail si vous souhaitez référencer différentes versions selon que vous construisez des versions ou des configurations de débogage.

Je ne pense pas que vous puissiez faire dépendre une solution d'une autre, mais vous pouvez effectuer vos builds automatisés dans un ordre approprié via des scripts personnalisés. Traitez votre bibliothèque commune comme s'il s'agissait d'une autre dépendance tierce comme NUnit, etc.

Jon Skeet
la source
Le projet a une piste où les paquets de pépites sont stockés et cela peut être changé par l'ouverture de la solution qui peut entraîner des maux de tête au moment de la construction, c'est donc une solution préférable.
Shane Courtrille
23

Vous pouvez joker en ligne en utilisant la technique suivante (qui est la manière dont la solution de @ Andomar est enregistrée dans le .csproj)

<Compile Include="..\MySisterProject\**\*.cs">
  <Link>_Inlined\MySisterProject\%(RecursiveDir)%(Filename)%(Extension)</Link>
</Compile>

Mettez:

    <Visible>false</Visible>

Si vous souhaitez masquer les fichiers et / ou empêcher que le caractère générique ne soit étendu si vous ajoutez ou supprimez un élément d'un dossier 'élément existant virtuel' comme MySisterProjectci-dessus.

Ruben Bartelink
la source
Joli. Cela ressemble à une solution agréable et légère, si vous pardonnez le jeu de mots.
CAD bloke
@Cad bloke: Cela fonctionne bien (tout comme votre jeu de mots :), mais il y a beaucoup à dire pour avoir fait de votre mieux pour éviter les liens en premier lieu
Ruben Bartelink
2
@CAD Bloke: Oui, celui-là est amusant. Pour plus de clarté, je dirai explicitement ce qui suit au cas où cela aiderait quelqu'un ... Vous pouvez décharger / recharger un projet pour qu'il reprenne les modifications. (Alt-P, L deux fois). Le problème avec VS2010 est que les fichiers .targets, etc. <Importédités dans des fichiers .csproj sont mis en cache jusqu'à ce que vous rechargiez les solutions comme vous le dites.
Ruben Bartelink
3
Voici ma dernière version du thème générique ... <Compile Include = ".._ Src * *. " Exclude = ".._ Src \ Properties \ AssemblyInfo.cs; .._ Src \ bin * * .; .._ Src \ obj * * .; .._ Src ***. Csproj; .._ Src ***. User; .._ Src ***. Vstemplate "> <Link> Src \% (RecursiveDir)% (Filename)% (Extension) < / Link> </Compile>
CAD bloke
1
@ChrisK Voici quelques précisions sur mes modifications dans le fichier csproj ... theswamp.org/index.php?topic=41850.msg472902#msg472902 . Je viens de le modifier dans Notepad ++. Lorsque je l'enregistre, VS voit qu'il a changé et demande un rechargement. Il existe des paramètres dans VS pour contrôler ce comportement.
CAD bloke
18

Vous devez simplement créer un projet de bibliothèque de classes distinct pour contenir le code commun. Il n'a pas besoin de faire partie d'une solution qui l'utilise. Référencez la bibliothèque de classes à partir de tout projet qui en a besoin.

La seule astuce est que vous devrez utiliser une référence de fichier pour référencer le projet, car il ne fera pas partie des solutions qui s'y réfèrent. Cela signifie que l'assemblage de sortie réel devra être placé dans un emplacement accessible à toute personne qui construit un projet qui y fait référence. Cela peut être fait en plaçant l'assembly sur un partage, par exemple.

John Saunders
la source
Je suppose que si je crée un événement de génération et publie la DLL dans le dossier _lib contrôlé par la source dans le projet de référencement, puis vérifie que cette DLL fonctionnerait .. semble un peu hacky tho ..
hanzolo
1
Si vous souhaitez contrôler à la source chaque génération, vous pouvez demander à une cible de génération d'extraire les DLL de la bibliothèque, de copier à partir des sorties de génération dans les dossiers de la bibliothèque, puis d'archiver les DLL.
John Saunders
8

Vous pouvez inclure le même projet dans plusieurs solutions, mais vous êtes assuré de rencontrer des problèmes à un moment donné (les chemins relatifs peuvent devenir invalides lorsque vous déplacez des répertoires par exemple)

Après des années de difficultés, j'ai finalement trouvé une solution viable, mais cela vous oblige à utiliser Subversion pour le contrôle de code source (ce qui n'est pas une mauvaise chose)

Au niveau du répertoire de votre solution, ajoutez une propriété svn: externals pointant vers les projets que vous souhaitez inclure dans votre solution. Subversion extraira le projet du référentiel et le stockera dans un sous-dossier de votre fichier de solution. Votre fichier de solution peut simplement utiliser des chemins relatifs pour faire référence à votre projet.

Si je trouve encore du temps, je vais l'expliquer en détail.

Philippe Leybaert
la source
Lors de la définition de vos projets, assurez-vous de n'utiliser que des chemins relatifs ... Cela devrait, en particulier pour un réutilisable, résoudre plus qu'un petit problème.
xtofl
5
Juste pour référence, svn:externalsdes liens durs vers un référentiel. Lorsque vous déplacez le référentiel, les liens externes pointent toujours vers l'ancien référentiel.
Andomar
Pour git, vous pouvez utiliser SubTree SVN: équivalents externes dans GIT?
Michael Freidgeim
8

Extrayez le code commun dans un projet de bibliothèque de classes et ajoutez ce projet de bibliothèque de classes à vos solutions. Vous pouvez ensuite ajouter une référence au code commun d'autres projets en ajoutant une référence de projet à cette bibliothèque de classes. L'avantage d'avoir une référence de projet par opposition à une référence binaire / d'assembly est que si vous changez votre configuration de construction en débogage, version, personnalisé, etc., le projet de bibliothèque de classes communes sera également construit en fonction de cette configuration.

Mehmet Aras
la source
5

C'est une bonne idée de créer une bibliothèque de classes dll contenant toutes les fonctionnalités courantes. Chaque solution peut référencer cette dll indépendamment indépendamment des autres solutions.

En fait, c'est ainsi que nos sources sont organisées dans mon travail (et je crois en beaucoup d'autres endroits).

Soit dit en passant, la solution ne peut pas dépendre explicitement d'une autre solution.

user88637
la source
1
Je crois que c'est l'un des points les plus importants de la question que de toute évidence une tonne de gens ne comprennent pas.
Del Lee
5

Deux étapes principales impliquées sont

1- Création d'une DLL C ++

En studio visuel

New->Project->Class Library in c++ template. Name of project here is first_dll in 
visual studio 2010. Now declare your function as public in first_dll.h file and 
write the code in first_dll.cpp file as shown below.

Code du fichier d'en-tête

// first_dll.h

using namespace System;

namespace first_dll 
{

public ref class Class1
{
public:
    static double sum(int ,int );
    // TODO: Add your methods for this class here.
};
}

Fichier Cpp

//first_dll.cpp
#include "stdafx.h"

#include "first_dll.h"

namespace first_dll
{

    double Class1:: sum(int x,int y)
    {
        return x+y;
    }

 }

Vérifie ça

**Project-> Properties -> Configuration/General -> Configuration Type** 

cette option doit être Dynamic Library (.dll) et générer la solution / le projet maintenant.

Le fichier first_dll.dll est créé dans le dossier Debug

2- Le lier dans un projet C #

Projet Open C #

Rightclick on project name in solution explorer -> Add -> References -> Browse to path 
where first_dll.dll is created and add the file.

Ajoutez cette ligne en haut dans le projet C #

Using first_dll; 

Maintenant, la fonction de la DLL est accessible en utilisant l'instruction ci-dessous dans une fonction

double var = Class1.sum(4,5);

J'ai créé la DLL dans le projet c ++ dans VS2010 et l'ai utilisé dans le projet VS2013 C #.

Croko
la source
5

Vous pouvez héberger un serveur NuGet interne et partager les bibliothèques communes qui seront partagées dans d'autres projets en interne et en externe.

Plus loin sur cette lecture

Si Zi
la source
4

Si vous essayez de partager du code entre deux types de projets différents (c'est-à-dire: projet de bureau et projet mobile), vous pouvez consulter le dossier des solutions partagées . Je dois le faire pour mon projet actuel car les projets mobiles et de bureau nécessitent tous deux des classes identiques qui ne sont que dans un seul fichier. Si vous suivez cette voie, tous les projets auxquels le fichier est lié peuvent y apporter des modifications et tous les projets seront reconstruits en fonction de ces modifications.

Stevoni
la source
Comment ça marche Stevoni? Pourriez-vous fournir plus d'informations?
Steve Dunn
@SteveDunn J'ai publié un tutoriel sur mon blog très rarement mis à jour (l'école et le travail stupides entravent le plaisir dans la vie). Vous pouvez le trouver ici
Stevoni
4

Il y a de très bonnes raisons d'utiliser "l'ajout de liens de fichiers existants" lors de la réutilisation de code entre projets, et c'est lorsque vous devez référencer et prendre en charge différentes versions de bibliothèques dépendantes.

Il n'est pas facile de créer plusieurs assemblys avec des références à différents assemblys externes sans dupliquer votre code ou utiliser des astuces avec le contrôle du code source.

Je crois qu'il est plus facile de maintenir un projet pour le développement et le test unitaire, puis de créer des projets de «construction» en utilisant des liens de fichiers existants lorsque vous devez créer les assemblys qui référencent différentes versions de ces assemblages externes.

Rick Sipin
la source
2

Une façon plus simple d'inclure un fichier de classe d'un projet dans un autre projet consiste à ajouter le projet dans la solution existante, puis à ajouter la référence DLL du nouveau projet dans le projet existant. Enfin, vous pouvez utiliser les méthodes de la classe ajoutée en décalant à l'aide de la directive en haut de la classe any.

Amarendra K
la source
2

Depuis VisualStudio 2015, si vous conservez tout votre code dans une seule solution, vous pouvez partager du code en ajoutant un projet partagé . Ajoutez ensuite une référence à ce projet partagé pour chaque projet dans lequel vous souhaitez utiliser le code, ainsi que les directives d'utilisation appropriées.

wecky
la source
2

Vous pouvez maintenant utiliser le projet partagé

Le projet partagé est un excellent moyen de partager du code commun entre plusieurs applications.Nous avons déjà expérimenté le type de projet partagé dans Visual Studio 2013 dans le cadre du développement d'applications Windows 8.1, mais avec Visual Studio 2015, il s'agit d'un nouveau modèle de projet autonome; et nous pouvons l'utiliser avec d'autres types d'applications comme la console, le bureau, le téléphone, l'application de magasin, etc. Ce type de projet est extrêmement utile lorsque nous voulons partager un code, une logique et des composants communs à plusieurs applications avec une seule plateforme . Cela permet également d'accéder aux API spécifiques à la plate-forme, aux actifs, etc.

entrez la description de l'image ici

pour plus d'informations, vérifiez ceci

Hussein Khalil
la source