Come condividi il codice tra progetti / soluzioni in Visual Studio?

Ho due soluzioni che hanno un codice comune, quindi mi piacerebbe estrarlo e condividerlo tra di loro. Inoltre, mi piacerebbe essere in grado di rilasciare quella libreria in modo indipendente perché potrebbe essere utile agli 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?

Un progetto può essere referenziato da più soluzioni.

Metti la tua biblioteca o il tuo core code in un progetto, quindi fai riferimento a quel progetto in entrambe le soluzioni.

È ansible “colbind” un file di codice tra due progetti. Fare clic con il pulsante destro del mouse sul progetto, selezionare Add -> Existing item , quindi fare clic sulla freccia giù accanto al pulsante Add :

Screengrab

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

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

È ansible includere un progetto in più di una soluzione. Non penso che un progetto abbia un concetto di quale soluzione ne faccia parte. Tuttavia, un’altra alternativa consiste nel rendere la prima soluzione costruita in un luogo noto e fare riferimento ai file binari compilati. Questo ha lo svantaggio che devi fare un po ‘di lavoro se vuoi fare riferimento a diverse versioni in base al fatto che stai costruendo nelle configurazioni di rilascio o di debug.

Non credo che si possa fare in modo che una soluzione dipenda da un’altra, ma è ansible eseguire le build automatiche in un ordine appropriato tramite script personalizzati. Considera la tua libreria comune come se fosse un’altra dipendenza di terze parti come NUnit, ecc.

Puoi eseguire la wild card in linea usando la seguente tecnica (che è il modo in cui la soluzione di @ Andomar viene salvata in .csproj)

  _Inlined\MySisterProject\%(RecursiveDir)%(Filename)%(Extension)  

Mettere in:

  false 

Se si desidera hide i file e / o impedire che la wild card includa l’espansione se si aggiunge o si rimuove un elemento da una cartella “elemento esistente virtuale” come sopra MySisterProject .

Dovresti semplicemente creare un progetto di libreria di classi separato per contenere il codice comune. Non deve essere parte di alcuna soluzione che lo utilizza. Fare riferimento alla libreria di classi da qualsiasi progetto che ne ha bisogno.

L’unico trucco è che sarà necessario utilizzare un riferimento file per fare riferimento al progetto, poiché non farà parte delle soluzioni che fanno riferimento ad esso. Ciò significa che l’assembly di output effettivo dovrà essere posizionato in una posizione accessibile a chiunque crei un progetto che lo faccia riferimento. Questo può essere fatto posizionando l’assieme su una condivisione, per esempio.

Estrai il codice comune in un progetto di libreria di classi e aggiungi quel progetto di libreria di classi alle tue soluzioni. Quindi è ansible aggiungere un riferimento al codice comune da altri progetti aggiungendo un riferimento a tale 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 comuni verrà costruito anche in base a tale configurazione.

Puoi includere lo stesso progetto in più di una soluzione, ma hai la certezza di imbatterti in problemi a volte lungo il percorso (i percorsi relativi possono diventare non validi quando si spostano le directory, ad esempio)

Dopo anni di difficoltà, ho finalmente trovato una soluzione praticabile, ma richiede l’uso di 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 tuo file di soluzione può semplicemente utilizzare percorsi relativi per riferirsi al tuo progetto.

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

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

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

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

Se stai tentando di condividere il codice tra due diversi tipi di progetto (ad esempio: progetto desktop e un progetto mobile), puoi esaminare la cartella delle soluzioni condivise. Devo farlo per il mio progetto attuale in quanto i progetti mobili e desktop richiedono entrambi classi identiche che sono solo in un file. Se segui questo percorso, qualsiasi progetto che ha il file collegato può apportare modifiche e tutti i progetti verranno ricostruiti rispetto a tali modifiche.

Ci sono ottime ragioni per utilizzare “l’aggiunta di link di file esistenti” quando riutilizzi il codice tra i progetti, e questo è il momento in cui devi 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.

Credo che sia più semplice mantenere un progetto per lo sviluppo e il test unitario, quindi creare progetti “build” usando collegamenti di file esistenti quando è necessario creare gli assembly che fanno riferimento a versioni diverse di tali assembly esterni.

Un modo più semplice per includere un file di class 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 class aggiunta decalgando usando direttiva all’inizio di ogni class.

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

Cpp File

 //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 la soluzione / progetto ora.

il file first_dll.dll viene creato nella cartella Debug

2- Collegarlo 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 in cima al progetto C #

 Using first_dll; 

Ora è ansible accedere alla funzione da dll utilizzando l’istruzione below in alcune funzioni

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

Ho creato dll nel progetto c ++ in VS2010 e l’ho usato nel progetto C # VS2013. Funziona bene.

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

Più avanti su questa lettura

A partire da VisualStudio 2015, se si mantiene tutto il codice in un’unica soluzione, è ansible condividere il codice aggiungendo un progetto condiviso . Quindi aggiungi un riferimento a questo progetto condiviso per ogni progetto in cui desideri utilizzare il codice e le direttive appropriate.