Come si condivide il codice tra progetti / soluzioni in Visual Studio?


229

Ho due soluzioni che hanno un codice comune, quindi vorrei estrarlo e condividerlo tra di loro. Inoltre, vorrei essere in grado di rilasciare quella libreria in modo indipendente perché potrebbe essere utile per gli altri.

  • Qual è il modo migliore per farlo con Visual Studio 2008?
  • Un progetto è presente in più di una soluzione?
  • Ho una soluzione separata per il pezzo di codice separato?
  • Una soluzione può dipendere da un'altra?

15
È il 2014. Nuget è la risposta.
Ravi,

1
@Ravi Volevo modularizzare un'applicazione Web di Visual Studio sviluppata nel mio ufficio. Tuttavia, quando provo a pensare di modulare l'applicazione Web di Visual Studio in diverse applicazioni Web, viene fuori la dipendenza circolare tra i componenti che è errata. Ad esempio, I impossibile modulare il progetto POCO per ciascuna delle applicazioni Web pianificate perché c'è troppa dipendenza. C'è un modo in cui potrei usare Nuget per aiutare con la modularizzazione?
CS Lewis,

Risposte:


70

Un progetto può essere referenziato da più soluzioni.

Inserisci la tua libreria o il codice principale in un progetto, quindi fai riferimento a quel progetto in entrambe le soluzioni.


150
Ok ma come? Alcune istruzioni?
cja,

2
Questa (vecchia) risposta è di per sé incompleta a causa del risultato in più assiemi: tuttavia, se accoppiata a ILMerge - specialmente con l'opzione internalize - diventa una soluzione molto potente.
user2246674,

2
@utente2246674: perché è incompleto a causa di più assiemi? L'OP non ha parlato di un singolo assemblaggio.
John Saunders,

1
@Jfly: rinominare le cose che non sono pubblicamente visibili non influenzerà il codice esterno. La ridenominazione delle cose che sono pubblicamente visibili dovrebbe essere fatta solo dove tutti i progetti che usano il codice comune e lo stesso codice comune sono in un'unica soluzione. È possibile creare manualmente soluzioni "master" che contengono tutti questi progetti e che vengono utilizzate solo per questo scopo.
John Saunders,

1
Dipende da cosa intendi per un'altra istanza. Probabilmente faresti bene a iniziare una nuova domanda con qualche dettaglio in più.
ilivewithian

248

È possibile "collegare" un file di codice tra due progetti. Fare clic con il pulsante destro del mouse sul progetto, scegliere Add-> Existing item, quindi fare clic sulla freccia giù accanto al Addpulsante:

Screengrab

Nella mia esperienza il collegamento è più semplice della creazione di una libreria. Il codice collegato genera un singolo eseguibile con una singola versione.


9
Dolce - questa è la risposta che stavo cercando. Non volevo una raccolta di DLL. evviva
Bloke CAD

63
Perché dovresti farlo in questo modo? Questo è il motivo per cui abbiamo librerie, incapsulamento. Non vedo alcun senso degli affari, o senso logico sul motivo per cui lo faresti.
Ryan Ternier,

16
Inoltre, i tuoi collegamenti potrebbero non essere sotto lo stesso controllo del codice sorgente. Questo è un suggerimento molto pericoloso.
Kugel,

11
Ci sono situazioni in cui questa soluzione è utile. Ad esempio, sto sviluppando in InfoPath 2007, dove non è semplice distribuire una DLL separata in SharePoint. Per condividere funzionalità comuni tra i moduli di InfoPath è molto utile l'approccio del file di classe collegato. Si trova a un livello sopra i singoli progetti di forma e tutto è controllato alla fonte a livello di radice.
Oliver Gray,

6
Come altro esempio di utilità dire che stai sviluppando due applicazioni che devono comunicare tra loro. Uno è a 64 bit e l'altro a 32, quindi non si desidera necessariamente creare DLL separate costruite dallo stesso codice per fare riferimento a ciascun progetto. In questo modo è possibile imitare la funzionalità c dell'utilizzo di un file .h.
user912447,

33

File > Add > Existing Project...ti permetterà di aggiungere progetti alla tua attuale soluzione. Aggiungo solo questo dato che nessuno dei post precedenti lo sottolinea. Ciò consente di includere lo stesso progetto in più soluzioni.


1
Questo funziona; il rovescio della medaglia non costruisce entrambi i progetti in un unico assieme.
Ian Boyd,

24

È possibile includere un progetto in più di una soluzione. Non credo che un progetto abbia un concetto di quale soluzione faccia parte. Tuttavia, un'altra alternativa è creare la prima soluzione in un luogo ben noto e fare riferimento ai file binari compilati. Questo ha lo svantaggio che dovrai fare un po 'di lavoro se vuoi fare riferimento a versioni diverse in base al fatto che tu stia creando configurazioni di debug o di rilascio.

Non credo che puoi fare in modo che una soluzione dipenda effettivamente da un'altra, ma puoi eseguire le tue build automatizzate in un ordine appropriato tramite script personalizzati. In sostanza tratta la tua libreria comune come se fosse un'altra dipendenza di terze parti come NUnit ecc.


Il progetto ha traccia di dove sono archiviati i pacchetti nuget e questo può essere modificato dall'apertura della soluzione che può portare a mal di testa al momento della creazione, quindi questa è una soluzione preferibile.
Shane Courtrille,

23

Puoi inserire i jolly in linea usando la seguente tecnica (che è il modo in cui la soluzione di @ Andomar viene salvata nel .csproj)

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

Mettere in:

    <Visible>false</Visible>

Se si desidera nascondere i file e / o impedire l'espansione dei caratteri jolly se si aggiunge o rimuove un elemento da una cartella "elemento esistente virtuale" come MySisterProjectsopra.


Ben fatto. Sembra una soluzione piacevole e leggera, se perdonerai il gioco di parole.
Bloke CAD,

@Cad bloke: Funziona sicuramente bene (come fa il tuo gioco di parole :), ma c'è molto da dire per fare del tuo meglio per evitare collegamenti in primo luogo
Ruben Bartelink,

2
@CAD Bloke: Sì, quello è divertente. Per chiarezza, dirò esplicitamente quanto segue nel caso in cui aiuti qualcuno ... Puoi scaricare / ricaricare un progetto per farlo raccogliere le modifiche. (Alt-P, L due volte). Il problema di VS2010 è che i file .targets, ecc. <ImportEd i file .csproj vengono memorizzati nella cache fino a quando non ricarichi le soluzioni come dici tu.
Ruben Bartelink il

3
Ecco la mia ultima versione del tema jolly ... <Compilare Include = ".._ Src * *. " Exclude = ".._ Src \ Properties \ AssemblyInfo.cs; .._ Src \ bin * * .; .._ Src \ obj * * .; .._ Src ***. Csproj; .._ Src ***. User; .._ Src ***. Vstemplate "> <Link> Src \% (RecursiveDir)% (Nome file)% (Estensione) < / Link> </Compile>
Bloke CAD

1
@ChrisK Ecco alcuni chiarimenti in più sulle mie modifiche nel file csproj ... theswamp.org/index.php?topic=41850.msg472902#msg472902 . L'ho appena modificato in Notepad ++. Quando lo salvo VS vede che è cambiato e chiede una ricarica. Ci sono impostazioni in VS per controllare questo comportamento.
Bloke CAD

18

Dovresti semplicemente creare un progetto Libreria di classi separato per contenere il codice comune. Non è necessario che faccia parte di alcuna soluzione che lo utilizza. Fare riferimento alla libreria di classi da qualsiasi progetto che ne abbia bisogno.

L'unico trucco è che dovrai utilizzare un riferimento al file per fare riferimento al progetto, poiché non farà parte delle soluzioni che fanno riferimento a esso. Ciò significa che il gruppo di output effettivo dovrà essere posizionato in una posizione a cui può accedere chiunque stia costruendo un progetto a cui fa riferimento. Questo può essere fatto posizionando l'assemblaggio su una condivisione, ad esempio.


Immagino che se creo un evento build e pubblichi la dll nella cartella _lib controllata dal sorgente nel progetto di riferimento, quindi controllo che DLL funzionerebbe .. sembra una specie di hacky tho ..
hanzolo,

1
Se vuoi controllare il codice sorgente di ogni build, puoi fare in modo che un target di build controlli le DLL della libreria, copi dalle copie della build nelle cartelle della libreria, quindi controlla le DLL.
John Saunders

8

È possibile includere lo stesso progetto in più di una soluzione, ma si garantisce che si verifichino problemi in futuro (i percorsi relativi possono diventare non validi quando si spostano le directory, ad esempio)

Dopo anni di lotta con questo, ho finalmente trovato una soluzione praticabile, ma richiede di utilizzare Subversion per il controllo del codice sorgente (che non è una cosa negativa)

A livello di directory della soluzione, aggiungere una proprietà svn: externals che punta ai progetti che si desidera includere nella soluzione. Subversion estrarrà il progetto dal repository e lo memorizzerà in una sottocartella del file della soluzione. Il file della soluzione può semplicemente utilizzare percorsi relativi per fare riferimento al progetto.

Se avrò ancora del tempo, lo spiegherò in dettaglio.


Nel definire i tuoi progetti, assicurati di usare solo percorsi relativi ... Ciò dovrebbe, soprattutto per quelli riutilizzabili, risolvere più di un piccolo problema.
xtofl,

5
Solo per riferimento, svn:externalscollegamenti reali a un repository. Quando si sposta il repository, i collegamenti esterni puntano ancora al vecchio repository.
Andomar,


8

Estrarre il codice comune in un progetto di libreria di classi e aggiungere quel progetto di libreria di classi alle soluzioni. Quindi è possibile aggiungere un riferimento al codice comune da altri progetti aggiungendo un riferimento al progetto a quella libreria di classi. Il vantaggio di avere un riferimento al progetto rispetto a un riferimento binario / assembly è che se si modifica la configurazione della build in debug, release, custom, ecc., Il progetto della libreria di classi comune verrà creato anche in base a tale configurazione.


5

È una buona idea creare una libreria di classi dll che contenga tutte le funzionalità comuni. Ogni soluzione può fare riferimento a questa dll indipendentemente da altre soluzioni.

In effetti, questo è il modo in cui le nostre fonti sono organizzate nel mio lavoro (e credo in molti altri luoghi).

A proposito, la soluzione non può dipendere esplicitamente da un'altra soluzione.


1
Credo che questo sia uno dei maggiori punti della domanda che un sacco di gente ovviamente non capisce.
Del Lee,

5

Sono due i passaggi principali coinvolti

1- Creazione di una dll C ++

In studio visivo

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.

Codice file di intestazione

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

File cpp

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

#include "first_dll.h"

namespace first_dll
{

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

 }

Controllare questo

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

questa opzione dovrebbe essere Dynamic Library (.dll) e creare subito la soluzione / progetto.

Il file first_dll.dll viene creato nella cartella Debug

2- Collegamento nel progetto C #

Apri progetto C #

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

Aggiungi questa riga all'inizio del progetto C #

Using first_dll; 

Ora è possibile accedere alla funzione da DLL usando l'istruzione sottostante in alcune funzioni

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

Ho creato DLL nel progetto c ++ in VS2010 e l'ho usata nel progetto VS2013 C #. Funziona bene.


5

È possibile ospitare un server NuGet interno e condividere le librerie comuni che saranno condivise in altri progetti internamente ed esternamente.

Più avanti su questa lettura


4

Se stai tentando di condividere il codice tra due diversi tipi di progetto (ovvero: progetto desktop e progetto mobile), puoi guardare nella cartella delle soluzioni condivise . Devo farlo per il mio progetto attuale poiché i progetti mobili e desktop richiedono entrambi classi identiche che si trovano solo in 1 file. Se segui questa strada, tutti i progetti a cui è collegato il file possono apportare modifiche ad esso e tutti i progetti verranno ricostruiti in base a tali modifiche.


Come funziona Stevoni? Potresti fornire maggiori informazioni?
Steve Dunn,

@SteveDunn Ho pubblicato un how-to sul mio blog aggiornato molto raramente (la stupida scuola e il lavoro ostacolano la cosa divertente della vita). Può essere trovato qui
Stevoni,

4

C'è un ottimo caso per usare "l'aggiunta di collegamenti a file esistenti" quando si riutilizza il codice tra progetti, e cioè quando è necessario fare riferimento e supportare diverse versioni di librerie dipendenti.

Realizzare più assiemi con riferimenti a diversi assiemi esterni non è facile da fare altrimenti senza duplicare il codice o utilizzare trucchi con il controllo del codice sorgente.

Ritengo che sia più semplice mantenere un progetto per lo sviluppo e l'unità di test, quindi creare progetti di "costruzione" utilizzando collegamenti a file esistenti quando è necessario creare gli assiemi che fanno riferimento a versioni diverse di tali assiemi esterni.


2

Un modo più semplice per includere un file di classe di un progetto in un altro progetto è aggiungendo il progetto nella soluzione esistente e quindi aggiungendo il riferimento DLL del nuovo progetto nel progetto esistente. Infine, puoi usare i metodi della classe aggiunta decalando usando la direttiva nella parte superiore di qualsiasi classe.


2

A partire da VisualStudio 2015, se conservi tutto il codice in un'unica soluzione, puoi condividere il codice aggiungendo un progetto condiviso . Quindi aggiungere un riferimento a questo progetto condiviso per ciascun progetto in cui si desidera utilizzare il codice, nonché le direttive di utilizzo appropriate.


2

Ora puoi usare il Progetto condiviso

Il progetto condiviso è un ottimo modo per condividere il codice comune su più applicazioni. Abbiamo già sperimentato il tipo di progetto condiviso in Visual Studio 2013 come parte dello sviluppo universale di app di Windows 8.1, ma con Visual Studio 2015 è un nuovo modello di progetto autonomo; e possiamo usarlo con altri tipi di app come Console, Desktop, Telefono, App Store ecc. Questo tipo di progetto è estremamente utile quando vogliamo condividere un codice, una logica e componenti comuni su più applicazioni con un'unica piattaforma . Ciò consente anche di accedere alle API, alle risorse ecc. Specifiche della piattaforma

inserisci qui la descrizione dell'immagine

per maggiori informazioni controlla questo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.