¿Cómo comparte código entre proyectos / soluciones en Visual Studio?

229

Tengo dos soluciones que tienen un código común, por lo que me gustaría extraerlo y compartirlo entre ellos. Además, me gustaría poder liberar esa biblioteca de forma independiente porque podría ser útil para otros.

  • ¿Cuál es la mejor manera de hacerlo con Visual Studio 2008?
  • ¿Hay un proyecto presente en más de una solución?
  • ¿Tengo una solución separada para el fragmento de código separado?
  • ¿Puede una solución depender de otra?
pupeno
fuente
15
Es 2014. Nuget es la respuesta.
Ravi
1
@Ravi Quería modularizar una aplicación web de Visual Studio desarrollada en mi oficina. Sin embargo, cuando intento pensar en modularizar la aplicación web de Visual Studio en diferentes aplicaciones web, surge la dependencia circular entre los componentes, lo cual es incorrecto. no se puede modularizar el proyecto POCO para cada una de las aplicaciones web planificadas porque hay demasiada dependencia. ¿Hay alguna manera de usar Nuget para ayudar con la modularización?
CS Lewis

Respuestas:

70

Un proyecto puede ser referenciado por múltiples soluciones.

Coloque su biblioteca o código central en un proyecto, luego haga referencia a ese proyecto en ambas soluciones.

ilivewithian
fuente
150
¿OK, pero como? Algunas instrucciones?
cja
2
Esta respuesta (antigua) está incompleta por sí sola debido a que resulta en múltiples ensamblajes: sin embargo, cuando se combina con ILMerge, especialmente con la opción internalizar, se convierte en una solución muy poderosa.
user2246674
2
@ user2246674: ¿por qué está incompleto debido a múltiples ensamblajes? El OP no dijo nada sobre una sola asamblea.
John Saunders
1
@Jfly: Cambiar el nombre de cosas que no son visibles públicamente no afectará el código externo. Cambiar el nombre de las cosas que son visibles públicamente solo debe hacerse donde todos los proyectos que usan el código común, y el código común en sí, están en una única solución. Puede crear manualmente soluciones "maestras" que contengan todos estos proyectos y que se usen solo para este propósito.
John Saunders el
1
Depende de lo que quieras decir con otra instancia. Probablemente harías bien en comenzar una nueva pregunta con más detalles.
ilivewithian
248

Puede "vincular" un archivo de código entre dos proyectos. Haga clic derecho en su proyecto, elija Add-> Existing item, y luego haga clic en la flecha hacia abajo al lado del Addbotón:

Captura de pantalla

En mi experiencia, vincular es más simple que crear una biblioteca. El código vinculado da como resultado un único ejecutable con una única versión.

Andomar
fuente
99
Dulce, esa es la respuesta que estaba buscando. No quería una colección de archivos DLL. aclamaciones
CAD bloke
63
¿Por qué lo harías de esta manera? Es por eso que tenemos bibliotecas, encapsulación. No veo sentido comercial o lógico sobre por qué harías esto.
Ryan Ternier el
16
Además, sus enlaces pueden no estar bajo el mismo control de fuente. Esta es una sugerencia muy peligrosa.
Kugel
11
Hay situaciones en las que esta solución es útil. Como ejemplo, estoy desarrollando en InfoPath 2007, donde no es sencillo implementar una DLL por separado en SharePoint. Para compartir una funcionalidad común entre los formularios de InfoPath, el enfoque del archivo de clase vinculado es muy útil. Se coloca un nivel por encima de los proyectos de formularios individuales y todo se controla desde el origen en el nivel raíz.
Oliver Gray
66
Como otro ejemplo de utilidad, diga que está desarrollando dos aplicaciones que necesitan comunicarse entre sí. Uno es de 64 bits y el otro es de 32, por lo que no necesariamente desea que se construyan dlls separados a partir del mismo código para hacer referencia a cada proyecto. De esta manera, puede imitar la funcionalidad c de usar un archivo .h.
user912447
33

File > Add > Existing Project...le permitirá agregar proyectos a su solución actual. Solo agrego esto ya que ninguna de las publicaciones anteriores lo señala. Esto le permite incluir el mismo proyecto en múltiples soluciones.

Aseem Kishore
fuente
1
Esto funciona En el lado negativo, no construye ambos proyectos en un solo ensamblaje.
Ian Boyd
24

Usted puede incluir un proyecto en más de una solución. No creo que un proyecto tenga un concepto de la solución de la que forma parte. Sin embargo, otra alternativa es crear la primera solución en un lugar conocido y hacer referencia a los binarios compilados. Esto tiene la desventaja de que tendrá que hacer un poco de trabajo si desea hacer referencia a diferentes versiones en función de si está creando configuraciones de lanzamiento o de depuración.

No creo que pueda hacer que una solución realmente dependa de otra, pero puede realizar sus compilaciones automatizadas en un orden apropiado mediante scripts personalizados. Básicamente trate su biblioteca común como si fuera otra dependencia de terceros como NUnit, etc.

Jon Skeet
fuente
El proyecto tiene un seguimiento de dónde se almacenan los paquetes nuget y esto se puede cambiar abriendo la solución, lo que puede generar dolores de cabeza en el momento de la compilación, por lo que esta es una solución preferible.
Shane Courtrille
23

Puede usar comodines en línea utilizando la siguiente técnica (que es la forma en que la solución de @ Andomar se guarda en el .csproj)

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

Meter en:

    <Visible>false</Visible>

Si desea ocultar los archivos y / o evitar que el comodín se expanda si agrega o elimina un elemento de una carpeta 'elemento virtual existente' como se indicó MySisterProjectanteriormente.

Ruben Bartelink
fuente
Buena esa. Esto parece una solución agradable y liviana, si perdonas el juego de palabras.
CAD bloke
@Cad bloke: Seguro que funciona bien (al igual que tu juego de palabras :), pero hay mucho que decir para hacer todo lo posible para evitar enlaces en primer lugar
Ruben Bartelink
2
@CAD Bloke: Sí, ese es divertido. Solo por claridad, diré lo siguiente explícitamente en caso de que ayude a alguien ... Puede descargar / volver a cargar un proyecto para que recoja los cambios. (Alt-P, L dos veces). El problema de VS2010 es que los archivos .targets, etc. <Importeditados en archivos .csproj se almacenan en caché hasta que vuelva a cargar las soluciones como usted dice.
Ruben Bartelink
3
Aquí está mi última versión del tema comodín ... <Compilar Incluir = ".._ Src * *. " Excluir = ".._ Src \ Properties \ AssemblyInfo.cs; .._ Src \ bin * * .; .._ Src \ obj * * .; .._ Src ***. Csproj; .._ Src ***. User; .._ Src ***. Vstemplate "> <Link> Src \% (RecursiveDir)% (Nombre de archivo)% (Extensión) < / Link> </Compile>
CAD bloke
1
@ChrisK Aquí hay más aclaraciones sobre mis ediciones en el archivo csproj ... theswamp.org/index.php?topic=41850.msg472902#msg472902 . Acabo de editarlo en Notepad ++. Cuando lo guardo, VS ve que ha cambiado y solicita una recarga. Hay configuraciones en VS para controlar este comportamiento.
CAD bloke
18

Simplemente crearía un proyecto de biblioteca de clases separado para contener el código común. No necesita ser parte de ninguna solución que lo use. Consulte la biblioteca de clases de cualquier proyecto que lo necesite.

El único truco es que necesitará usar una referencia de archivo para hacer referencia al proyecto, ya que no será parte de las soluciones que se refieren a él. Esto significa que el conjunto de salida real tendrá que colocarse en una ubicación a la que pueda acceder cualquiera que construya un proyecto que lo haga referencia. Esto se puede hacer colocando el ensamblaje en un recurso compartido, por ejemplo.

John Saunders
fuente
Supongo que si creo un evento de compilación y publico el dll en la carpeta _lib controlada por la fuente en el proyecto de referencia, luego verifico que la DLL funcionaría ... parece un poco
chiflado
1
Si desea controlar la fuente de cada compilación, puede hacer que un objetivo de compilación revise los archivos DLL de la biblioteca, copie desde los resultados de la compilación en las carpetas de la biblioteca y luego registre los archivos DLL.
John Saunders el
8

Podría incluir el mismo proyecto en más de una solución, pero está garantizado que tendrá problemas en algún momento (las rutas relativas pueden volverse inválidas cuando mueve directorios, por ejemplo)

Después de años de luchar con esto, finalmente se me ocurrió una solución viable, pero requiere que uses Subversion para el control de la fuente (que no es algo malo)

En el nivel de directorio de su solución, agregue una propiedad svn: externals que apunte a los proyectos que desea incluir en su solución. Subversion extraerá el proyecto del repositorio y lo almacenará en una subcarpeta de su archivo de solución. Su archivo de solución simplemente puede usar rutas relativas para referirse a su proyecto.

Si encuentro más tiempo, explicaré esto en detalle.

Philippe Leybaert
fuente
Al definir sus proyectos, asegúrese de usar solo rutas relativas ... Eso debería, especialmente para uno reutilizable, resolver más que un pequeño problema.
xtofl
55
Solo como referencia, svn:externalsenlaces duros a un repositorio. Cuando mueve el repositorio, los enlaces externos aún apuntan al antiguo repositorio.
Andomar
Para git puedes usar SubTree SVN: equivalentes externos en GIT?
Michael Freidgeim
8

Extraiga el código común en un proyecto de biblioteca de clases y agregue ese proyecto de biblioteca de clases a sus soluciones. Luego, puede agregar una referencia al código común de otros proyectos agregando una referencia de proyecto a esa biblioteca de clases. La ventaja de tener una referencia de proyecto en lugar de una referencia binaria / de ensamblaje es que si cambia la configuración de compilación para depurar, liberar, personalizar, etc., el proyecto de biblioteca de clase común se construirá también en función de esa configuración.

Mehmet Aras
fuente
5

Es una buena idea crear una biblioteca de clase dll que contenga todas las funciones comunes. Cada solución puede hacer referencia a este dll independientemente, independientemente de otras soluciones.

De hecho, así es como se organizan nuestras fuentes en mi trabajo (y creo en muchos otros lugares).

Por cierto, Solution no puede depender explícitamente de otra solución.

usuario88637
fuente
1
Creo que este es uno de los puntos más importantes de la pregunta que obviamente mucha gente no entiende.
Del Lee
5

Dos pasos principales involucrados son

1- Creando un dll C ++

En estudio visual

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.

Código de archivo de encabezado

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

Archivo Cpp

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

#include "first_dll.h"

namespace first_dll
{

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

 }

Mira esto

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

esta opción debería ser Dynamic Library (.dll) y construir la solución / proyecto ahora.

El archivo first_dll.dll se crea en la carpeta Debug

2- Vinculación en proyecto C #

Proyecto abierto C #

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

Agregue esta línea en la parte superior del proyecto C #

Using first_dll; 

Ahora se puede acceder a la función de dll usando la siguiente declaración en alguna función

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

Creé dll en el proyecto c ++ en VS2010 y lo usé en el proyecto VS2013 C #. Funciona bien.

Croko
fuente
5

Puede alojar un servidor NuGet interno y compartir las bibliotecas comunes que se compartirán en otros proyectos interna y externamente.

Más adelante en esta lectura

Si Zi
fuente
4

Si está intentando compartir código entre dos tipos de proyectos diferentes (es decir, proyecto de escritorio y un proyecto móvil), puede buscar en la carpeta de soluciones compartidas . Tengo que hacer eso para mi proyecto actual, ya que los proyectos móviles y de escritorio requieren clases idénticas que solo están en 1 archivo. Si sigue esta ruta, cualquiera de los proyectos que tienen el archivo vinculado puede realizar cambios y todos los proyectos se reconstruirán con esos cambios.

Stevoni
fuente
¿Cómo funciona eso, Stevoni? ¿Podría proporcionar más información?
Steve Dunn
@SteveDunn Publiqué un tutorial en mi blog que rara vez se actualiza (la estúpida escuela y el trabajo se interponen en el camino de la diversión en la vida). Se puede encontrar aquí
Stevoni
4

Hay un muy buen caso para usar "agregar enlaces de archivos existentes" al reutilizar código en proyectos, y es cuando necesita hacer referencia y admitir diferentes versiones de bibliotecas dependientes.

Hacer múltiples conjuntos con referencias a diferentes conjuntos externos no es fácil de hacer sin duplicar su código o utilizar trucos con el control del código fuente.

Creo que es más fácil mantener un proyecto para desarrollo y prueba unitaria, luego crear proyectos de 'compilación' usando enlaces de archivos existentes cuando necesite crear los ensamblajes que hacen referencia a diferentes versiones de esos ensamblajes externos.

Rick Sipin
fuente
2

Una forma más sencilla de incluir un archivo de clase de un proyecto en otro proyecto es agregar el proyecto en la solución existente y luego agregar la referencia DLL del nuevo proyecto en el proyecto existente. Finalmente, puede usar los métodos de la clase agregada al descalcificar usando la directiva en la parte superior de cualquier clase.

Amarendra K
fuente
2

A partir de VisualStudio 2015, si mantiene todo su código en una solución, puede compartir el código agregando un proyecto compartido . Luego agregue una referencia a este proyecto compartido para cada proyecto en el que desee usar el código, así como las directivas de uso adecuadas.

wecky
fuente
2

Ahora puedes usar el proyecto compartido

Shared Project es una excelente manera de compartir código común en varias aplicaciones. Ya hemos experimentado con el tipo de proyecto compartido en Visual Studio 2013 como parte del desarrollo de aplicaciones universales de Windows 8.1, pero con Visual Studio 2015, es una nueva plantilla de proyecto independiente; y podemos usarlo con otros tipos de aplicaciones como consola, escritorio, teléfono, tienda de aplicaciones, etc. Este tipo de proyecto es extremadamente útil cuando queremos compartir un código común, lógica y componentes a través de múltiples aplicaciones en una sola plataforma . Esto también permite acceder a las API, activos, etc. específicos de la plataforma.

ingrese la descripción de la imagen aquí

para más información revisa esto

Hussein Khalil
fuente