JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Compartir código en Visual Studio: proyectos compartidos o librerías

La manera tradicional de compartir código entre proyectos en Visual Studio siempre ha sido la creación de bibliotecas de código, es decir, ensamblados en forma de DLL que permiten la reutilización de clases entre proyectos.

Nota: el término original en inglés es "library" y se suele traducir al español erróneamente como "librería". En realidad la traducción y el término correcto en español es "biblioteca", en todas sus acepciones. Se trata del típico "false friend" inglés/español. En el título he puesto "librería" porque seguramente será lo que busquéis la mayoría. 

Este es el camino a seguir en la mayor parte de las ocasiones ya que creamos una DLL con la funcionalidad requerida a compartir entre varias aplicaciones, y simplemente añadiendo una referencia a dicha DLL (o el proyecto, si está en una misma solución) a otro de nuestros proyectos en Visual Studio ya tenemos la funcionalidad que necesitábamos:

Añadir una referencia a un proyecto

La verdad es que esto es muy cómodo, pero no siempre es lo que queremos. En ocasiones lo que nos interesa es compartir funcionalidad entre proyectos compartiendo directamente el código fuente. A lo mejor no nos interesa distribuir otra DLL con el producto final, o tal vez queremos ir tocando al código original en función de las necesidades y que éste evoluciones por igual en todos los proyectos que lo usan. También puede ser muy útil cuando quieres usar el mismo código genérico en varios proyectos que se enfocan y compilan para plataformas diferentes.

Para solucionar este tipo de problemas, en Visual Studio 2013 update 2 (en abril de 2014) se introdujo un nuevo tipo de proyectos: los proyectos compartidos.

El archivo de un proyecto compartido tiene la extensión .shproj y al contrario que en el caso de una biblioteca, lo que se utiliza es directamente el código fuente, no la DLL resultante.

Por lo tanto, el código fuente de ese proyecto compartido es como si formase parte de nuestro proyecto actual, no de un proyecto aparte, de modo que se compila como cualquier otro archivo de nuestro proyecto y forma parte del ensamblado final de la aplicación. Para entendernos, es como si tuviésemos una subcarpeta con esos archivos de código dentro de nuestro proyecto. Al final obtenemos una sola DLL. Pero es un proyecto independiente que podemos usar en varios sitios a la vez.

Por ejemplo, en mi proyecto Open Source MIIS, un CMS basado en archivos, quería compartir algún código entre éste y otro side-project comercial que tengo, IISMailer, pero no quería tener una biblioteca común que distribuir y además al mismo tiempo me interesaba poder tocarle al código en cualquiera de los dos proyectos y que ambos se beneficiaran de los añadidos. La solución: usar un proyecto compartido.

En este caso le llamé IISHelpers, y aquí podemos verlo en el código fuente de MIIS abierto en Visual Studio:

Un proyecto compartido y otro qu elo referencia en Visual Studio

El recuadro de arriba es el proyecto compartido en sí, que se ve como un proyecto aparte (porque lo es) pero se comporta como si el código estuviese dentro del proyecto principal, desde el cual se hace referencia. Esto último podemos verlo si desplegamos las referencias del proyecto principal, en donde se ve con el mismo icono de proyecto compartido que arriba. La forma de añadirla es la habitual, simplemente lo elegimos desde la pestaña "Proyectos".

Cómo crear un proyecto compartido en Visual Studio

Crear uno de estos proyectos es de lo más sencillo desde VS2015 (antes no lo era tanto), y consiste simplemente en elegirlo en la lista de plantillas de proyecto que tiene Visual Studio al añadir un nuevo proyecto desde una solución, así:

Animación que muestra cómo agregar un proyecto compartido a una solución en Visual Studio

Ahora solo resta añadir la referencia en otro proyecto para que forme parte de éste.

Por regla general es fácil y directo (ahora te cuento cuándo no). Basta con ir a agregar una referencia y elegir el proyecto compartido dentro de la pestaña de "Proyectos compartidos", así:

Añadiendo referencia a un proyecto compartido

En esta animación primero añado a la solución un proyecto compartido existente, y luego añado una referencia a éste desde el proyecto principal.

No aparecen referencias a proyectos compartidos en proyectos web en VS2017

Visual Studio 2017 añadió un bug a la hora de manejar proyectos compartidos desde aplicaciones Web. Simplemente no aparece la pestaña de "Proyectos compartidos" al agregar una referencia y por lo tanto no podemos agregarla visualmente tal y como se observa en la animación anterior.

En Visual Studio 2019 lo han solucionado y funciona perfectamente también proyectos web. Esperemos que dure.

Por suerte solucionarlo es relativamente sencillo, pero engorroso. Lo que tenemos que hacer es editar manualmente el archivo del proyecto al que queremos añadir el proyecto compartido. Partiendo de la base de que ya has añadido el proyecto compartido a la solución, ahora debes abrir con un editor de texto (el mismo bloc de notas nos vale) el archivo .csproj que tiene la definición de tu proyecto de C# (.vbproj en el caso de Visual Basic .NET). Dentro de este archivo XML debes localizar los nodos <import> y debes añadir entre éstos un nuevo nodo import que apunte al archivo .projitems de tu proyecto compartido, usando rutas relativas o absolutas para ello, así:

<Import Project="..\..\MiProyCompartido\MiProyCompartido.projitems" Label="Shared" />

Nodo import del archivo de proyecto de C#

Esto le indica a Visual Studio que debe cargar ese proyecto compartido como referencia. El archivo .projitems contiene una lista con todos los archivos de código del proyecto compartido y la manera en la que debe actuar el compilador con ellos (puedes abrirlo para comprobarlo).

Si ahora abres la solución en Visual Studio verás que el proyecto de código compartido está ahí, al igual que su referencia y todo funciona como cabría esperar.

Muy importante: como a los proyectos compartidos se accede a través de su ruta, es importante que si los movemos de sitio lo tengamos en cuenta y los cambiemos tanto en los archivos .sln o como en los .csproj que hagan referencia a los mismos, o Visual Studio no podrá cargarlos. Por eso son mejores las rutas relativas que las absolutas, pero de todos modos puede ser un engorro. De hecho esta es una de las mayores "pegas" del uso de este tipo de proyectos. Ahora bien, si tenemos un entorno de desarrollo estable y los archivos de proyecto los tenemos siempre en los mismos sitios, no debería haber problema. Pero debes tenerlo en cuenta, sobre todo si compartes proyectos con más miembros de un equipo.

Referencias a archivos individuales

Un último detalle para terminar. Si lo único que necesitas compartir de esta manera son uno o dos archivos, quizá lo del proyecto compartido sea un poco "matar moscas a cañonazos". Desde las primeras versiones de Visual Studio existe una manera de compartir archivos individuales de manera parecida, para reutilizarlos como si fueran parte del proyecto actual aunque estén en otro lado. Se trata de la opción Añadir como vínculo que se ofrece al agregar un archivo existente:

Añadir referencia como vínculo a un archivo

De esta manera el archivo se utiliza directamente desde donde esté, fuera del proyecto, pero se compila como un archivo de código fuente más. O sea, consigue lo mismo que los proyectos compartidos pero archivo a archivo, lo cual está bien si solo son como mucho un par de ellos (más se hace inmanejable y es mejor recurrir a los proyectos compartidos).

¡Espero que te resulte útil!

José Manuel Alarcón José Manuel Alarcón
Fundador de campusMVP.es, el proyecto de referencia en formación on-line para programadores en lengua española. Autor de varios libros y cientos de artículos. Galardonado como MVP de Microsoft desde 2004. Gallego de Vigo, amante de la ciencia y la tecnología, la música y la lectura. Ayudando a la gente en Internet desde 1996.
Descarga GRATIS mi último libro (no técnico): "Tres Monos, Diez Minutos".
Banner

Agregar comentario