domingo, 28 de octubre de 2012

[Visual Studio] Unir proyectos

 

Introducción


En algunas ocasiones se escribe código en proyectos separados, ya sea para probar algún concepto, se trabajo en equipos diferentes y cada uno creo su ambiente, etc

pero en todos estos casos al final se requiere unir bajo una única solución todo lo confeccionado, existen diferentes formas de lograrlo pero creo que lo que explicare es la mas simple.

Usaremos un ejemplo sencillo para demostrar como unir proyectos, además de evaluar que consideraciones hay que tener en el proceso.

Se han creado dos aplicaciones del tipo Windows Application, pero tengan en cuenta que esto mismo aplica a cualquier otro tipo de proyecto.

Por un lado tendremos un proyecto con un único form definido como MDI Container, este será la base al cual se agregara lo proveniente de otros desarrollos

image

Por el otro lado se desarrolla un forma simple que accede a una db local usando dataset tipado

image

La idea es mover el Form1, el dataset tipado y la base de datos de WinApp2 a WinApp1

 

Mover archivos entre proyecto


Lo primero que hay que conocer serán los archivos ha mover entre proyectos, esto parece ser una tarea simple pero por lo general un ítem puede estar compuesto por otros ítems que los complementan

Por ejemplo un formulario se compone de 3 archivos, el .cs (seria el formulario en si mismo), el .Designer.cs (donde se definen los controles que se agregan en tiempo diseño) y un .resx (define los textos he imágenes según la cultura). Lo mismo sucede con el dataset tipado, compuesto por el .xsd, .Designer.cs, .xsc y .xss

En proyecto escritos con C# visualizar estos archivos es simple ya que el Solución Explorer brinda la posibilidad directa de expandir los archivos relacionados

image

Pero esto no sucede en VB.NET, por defecto el Solution Explorer no los muestra

image

para poder ver los archivos relacionados a un ítem hay que habilitarlo usando la opción “Show All Items”

image

Ahora que sabemos que archivos se requieren mover de un proyecto a otro haremos uso del Windows Explorer, se podrá acceder a la carpeta de forma directa usando

SNAGHTML15b51af

Se deberán seleccionar todos los archivos implicados para cada ítem

SNAGHTML15d877e

y se moverán a la carpeta del proyecto destino, el cual ya tenia el form principal

SNAGHTML15f17f9

 

Incluir archivo al proyecto


Una vez que tenemos los archivos ubicados en la estructura de carpeta del proyecto destino volvemos al Visual Studio para incluir estos archivos, para poder lograrlo será necesario volver los archivos visibles usando la opción “Show All Items”

image

como se observa en la imagen los archivos que se han copiado a la carpeta están visibles pero con un icono de color blanco, lo que indica que están fuera del proyecto, en realidad están en la carpeta (dentro de la estructura) pero no incluidos al proyecto

Para incluirlos solo bastara usar la opción “Include In Project”

image

lo cual no solo agregara el .cs sino también los archivos relacionados, solo será cuestión de aplicar esto al resto de los archivos para concluir con la integración

 

Algunas consideraciones


Luego de incluir los archivos puede que la tarea no termine allí, sino que hay que adecuar el código

Normalmente cuando se desarrolla bajo un proyecto se definen namespaces, el formulario que se ha incluido sigue conservando el nombre que se uso en el proyecto anterior

image

es por eso que será necesario revisar el código de los ítems incluidos para adaptarlos de forma correcta al nuevo proyecto, y en algunos casos no alcanzara con ir al código del form, sino también se deberá cambiar dentro del Designer.cs o sus archivos relacionados

SNAGHTML1aedbc6

Con respecto a los dataset puede que sea necesario ejecutar la opción que vuelve a regenerar el código en base a la metadata

image

esto adecua el código generado para que se adapte de forma automática al nuevo namespace

 

Conclusión


Los pasos para unir proyecto no son difíciles de aplicar, solo es cuestión de conocer las opciones y que archivos mover de un proyecto a otro.

Si bien aquí solo tratamos algunos tipos de archivos la misma técnica se puede aplicar a cualquier otro que se este utilizando.

29 comentarios:

  1. Muy buena entrada de tu blog Leandro hace tiempo estaba buscando un tutorial que explique asi de claras las cosas.Todo debe comenzar por el principio!

    ResponderEliminar
  2. Hola Leandro, tengo una duda respecto a como hacer que un sistema en vb.net se restringa a instalarse en un solo pc o si fuera mejor aun poder validar que solo se corra en una pc gracias

    ResponderEliminar
  3. hola

    en principio si es algo que queres limitar deberas implemementarlo puntualmente

    podria ser por algun sistema de licencias

    http://social.msdn.microsoft.com/Forums/es-ES/vcses/thread/59b5d723-f0c2-41fd-89d5-474e6feddc53

    o podrias ser algo mas fisico por medio de una llave hardlock

    http://social.msdn.microsoft.com/Forums/es-MX/vcses/thread/f80ebca4-fec7-4d62-9a09-126a7b100517

    saludos

    ResponderEliminar
  4. Hola, muchas gracias por tu blog en general y en particular por esta entrada.

    Yo tengo un ordenador a 64bits, Access 2010 y Visual Studio 2010 desarrollando en C#.

    He puesto todos mis proyectos a x86 como plataforma de destino, en incluido en el proyecto de base de datos un .sdf (base de datos local)

    Cuando modifico la conexión a Access, selecciono mi .accdb y le doy a aceptar me dice que Microsoft.ACE.OLEDB12.0 no está registrado en este equipo local. El mismo mensaje de error me da si todos los proyectos están a x64.

    Me instalé AccessDatabaseEngine_X64 porque mi Office es de 64 y AccessDatabaseEngine no me dejó instalarlo.

    ¿cómo puedo incorporar mi base de datos en el proyecto?


    Muchas gracias.

    ResponderEliminar
  5. hola Ismael

    o sea apuntas a este otro articulo

    [ADO.NET] Ms Access y arquitectura 64bit

    si es access 2010 no necesitas cambiar la compilacion a x86, deberia funcionar

    es mas si tienes office con access instalado en la pc no necesitarias AccessDatabaseEngine

    cuando dices que AccessDatabaseEngine no dejo instalarlo, se produce algun error en concreto ?

    ademas que no funcione access por un tema con el proveedor que relacion tiene con incorporarlo al proyecto, porque son dos cosas distintas

    saludos

    ResponderEliminar
  6. Hola Leandro.

    El error al instalar AccessDatabaseEngine es de compatibilidad de 32/64 bits, mi office es de 64.

    En principio todo funciona, lo único que no puedo hacer es incorporar una base de datos local (.sdf) en el proyecto.

    agradecido por tu respuesta.

    ResponderEliminar
  7. hola

    no entiendo que tiene que ver AccessDatabaseEngine, los 64bits, office y poder incluir un .sdf

    no veo relacion, un .sdf es una db de Sql comapct, este no requiere, ni office, ni AccessDatabaseEngine, ni nada parecido

    solo agregas un nuevo item

    loca Database

    y usas las clases SqlCeCommand, SqlCeConexion, etc

    saludos

    ResponderEliminar
  8. Hola Leandro, tengo dos proyectos windosform hechos en c#. net.. puedo unirlos pero a la hora de ejecutar no funcionan bien, puede ser porque no agregué las carpetas bin y debug?

    ResponderEliminar
  9. hola Ruth

    pero el proyecto compila sin errores ?
    las carpetas que mencionas se crean de forma automatica, si vas a las propiedades del proyecto en la sola de Build veras que alli define esas carpetas donde compilara el proyecto

    si algo no funciona veria que error se genera y si los namespace estan correctos despues de la union de los proyecto

    saludos

    ResponderEliminar
  10. hola leandro tengo este problema, estaba creando un proyecto bajo un nombre X, luego intente "guardar como" otro nombre XX, por error no se cual de los dos fue el que descarté y cual es el que guarde, lo cierto es que tengo en mi escritorio 3 archivos, uno me abre el codigo de todo el proyecto, otro es el archivo .resx con las imagenes y el otro es el codigo de como programe los movimientos que hice, como puedo unir todo eso y tener mi trabajo original? gracias

    ResponderEliminar
  11. hola Jorge

    que situacion rara, no detectas ningun archivo que podria ser el del proyecto, quizas si haces una busqueda en toda la unidad de disco donde grabas usualmente los archivos?

    sino podrias volver a crear el proyecto he ir incluyendo los archivos de forma individual


    saludos

    ResponderEliminar
  12. Hola Leandro yo intente hacer lo mismo pero resulta que al incluir los archivos del proyecto fuente en el proyecto destino, se pierde el archivo .exe del bin/debug y por ende no se genera, solamente sale un mensaje que dice error al generar!! no se que pasa, si luego borro los archivos que incluí ya se genera normal, no se que hacer, es un proyecto algo grandecito programado en capaz que se esta trabajando en un grupo de 3 personas y no logro juntarlo sin que se dañe el ejecutable!

    ResponderEliminar
  13. hola Luis

    por lo que veo el .exe no se genera porque al unir se producen errores que debe ser solucionados

    solo puedes ver un unico error, o hay varios?
    porque havria que solucionarlo para que funcione, validen el tema de namespaces a veces eso puede traer problemas

    si trabajan en grupo porque no usaron algun soft de source control como ser TFS
    http://tfs.visualstudio.com/

    este es de libre uso hasta 5 personas, asi evitan tener que andar uniendo el codigo, y trabajan todos en colaboracion

    saludos

    ResponderEliminar
  14. Hola Leandro muchas gracias por atender al llamado, ya lo pude solucionar, lo que sucede es que solamente me salía Error al Generar pero no me salía la lista de errores y el archivo .exe.manifest me salia como que no existia, solamente era en la opcion Ver, Lista de errores y ahi si me salio la lista y los solucioné, el problema es que normalmente cuando lo compilaba el me tiraba la lista de errores y en este caso pensé que tenia que ver con el archivo .exe.manifest!! una vez mas gracias por atender y con respecto al TFS la verdad no lo conozco pero voy a documentarme al respecto

    ResponderEliminar
  15. hola Leandro,he leido varios de tus articulos y me gusta la forma de que los expones son claros, he usado varias de tus ideas y me han funcionado perfectamente muchas gracias.
    tengo un problema y no he visto como arreglarlo.
    tengo una function donde se calcula y almacena informacion a una base de datos, pero requiero que esa function sea usada en diferentes formas de aspx en c#, tienes algun ejemplo de como compartir codigo?
    saludos.
    Alejandro

    ResponderEliminar
  16. hola Alejandro

    podrias declarar esa funcionalida de calculo en una clase separada para asi poder invocarla desde las diferentes paginas

    o sea

    public class CalculoEngine{

    public static decimal Calcular(decimal param1, decimal param2){
    //aqui codigo
    }
    }

    si esto lo defines en un .cs separado podrias desde las paginas usar

    decimal result = CalculoEngine.Calcular(...);

    en este caso declare el metodo como static por eso no requiere instanciar la clase, pero esto es opcional

    de esta forma podrias poder funcionalidad comun para todas las paginas

    saludos

    ResponderEliminar
  17. Hola, es la primera vez que participo aquí, verá, quiero incluir 4 proyectos en uno solo, sin incluir bases de datos.
    Lo hice cómo en la explicación que pone. El detalle está en que mi proyecto contiene muchas imágenes, y se generan múltiples errores, con respecto a la carpeta Resources.resx, a pesar de que he copiado todas las imágenes a la capeta Resources... ¿Cómo puedo copiar todo incluyendo imágenes?

    ResponderEliminar
    Respuestas
    1. hola,
      la verdad es que no creo que haya una tecnica concreta para hacerlo salvo incluir las imagenes en el proyecto y recrear el resx
      no se muy bien para que usas los recursos o las imagenes, pero podrias simplemente incluir los archivos de imagen como embebidos
      imagen
      con esto podrias hacer uso de la imagen sin necesidad de crear un resx, por supuesto la forma de acceder a recurso es diferente lo harias por medio de Assembly
      saludos

      Eliminar
  18. Leandro buen dia. Estoy pasando de VB a VC# en visual Studio 2012 pero me encuentro con algunas novedades como que el Designer.cs no se regenera segun mis cambios en el codigo o en el Form. Por ejemplo si cambias el nombre de un metodo o lo borras porque ya no lo necesitas, este cambio queda en el Designer.cs y genera un error creando un doble trabajo al programar. Que me puedes comentar... Gracias y saludos cordials.

    ResponderEliminar
    Respuestas
    1. hola
      la verdad esta bastante raro lo que comentas, si haces un Rebuild de la solucion tampoco se actualiza el Designer ?
      si creas un proyecto de cero en c# y realizas cambias en el codigo el designer tampoco se actualiza
      el pasaje de vb.net a c# lo realizaste mediente conversion con alguna tool o estas pasando parte por parte manualmente?
      saludos

      Eliminar
  19. Como llamar desde un boton en la primera aplicacion a un webform de otra aplicacion.

    ResponderEliminar
    Respuestas
    1. hola
      que seria esa "otra aplicacion"? ambas estan en la misma solucion?, ambas son proyecto de tipo windows application? las dos compilan a .exe no vas a poder llamarlas salvo que uses el Process.Start() para lanzar el .exe de una aplicaicon desde la otra
      saludos

      Eliminar
  20. Hola a todos

    Es posible mesclar un proyecto escrito en VB con uno escrito en C#.

    ResponderEliminar
    Respuestas
    1. hola
      En una misma solucion puede poner proyectos en distintos lenguajes
      Ahora en un mismo proyecto ubicar clases o codigo de distintos lenguajes, eso no se puede
      saludos

      Eliminar
  21. Hola:

    Me encuentro con un problema similar al de Ana Cecilia. Tengo dos proyectos en la misma solución (Proyecto 1 y Proyecto 2) y quiero compartir los recursos (son .wav y .mp3) entre los dos proyectos.

    Los recursos están en el proyecto 2 y deseo utilizarlos en el proyecto 1 sin duplicarlos.

    Para conseguirlo lo he intentado creando una carpeta de soluciones a la que he llamado "Recursos Comunes" en la que he copiado los recursos de la carpeta "Resources" del proyecto 2.

    El "copiado" es sólo virtual puesto que no se crea ninguna carpeta real con ese nombre. Si miro, por ej., las propiedades de bip1.wav en la carpeta "Recursos Comunes" la ruta es la del proyecto 2.

    Mi pregunta es: ¿Cómo consigo utilizar los recursos que tengo en la carpeta de soluciones "Recursos Comunes" en el proyecto 1? (si es que este sistema es válido)

    Saludos y felicidades por tu trabajo Leandro!

    ResponderEliminar
    Respuestas
    1. hola
      Si estos archivos estan embebidos dentro del proyecto y se compila dentro del mismo
      Podrias suar esta tecnica
      Code: Retrieving an Image that is an Embedded Resource (Visual C#)
      como veras accedes al assembly y de este recuperas en base al nombre completo, o sea namespace y nombre del recurso obteniendo el stream que podrias grabar fisicamente para trabjarlo
      En el ejemplo se recupero un archivo de image, pero puede aplicar a cualqueir otro tipo de archivo
      saludos

      Eliminar
    2. Empecé con la técnica que sugerías y funciona correctamente, pero finalmente decidí decantarme por crear un .resx porque es muy versátil. No obstante: gracias maestro!!

      PD: No sé de donde sacas tiempo para colaborar en tantos lugares (es raro buscar sobre algún tema de programación en algún foro en español y no dar en un momento u otro contigo)

      Eliminar
    3. hola
      Si un resx es una buena alternativa.
      El tiempo se hace en los ratitos que uno tiene, debo decir que no es una tarea simple, pero bueno me gusta poder ayudar en lo que puedo.
      saludos

      Eliminar