2010-12-02 24 views
20

¿Cómo puedo tener código compartido entre dos proyectos sin hacer un dll?Compartir código entre 2 proyectos sin dll

La cuestión es la siguiente: Tengo una herramienta que sincroniza los usuarios & grupos de LDAP a una base de datos.

Ahora la herramienta es un servicio de Windows, pero para ello, como tal, es muy difícil y requiere mucho tiempo.

por lo que me hice una aplicación de consola en el que puedo probar la sincronización LDAP, y luego simplemente copiar los respectivos archivos de código fuente-a del proyecto de servicio.

... Pero mantener los archivos comunes en sincronía es un poco de un problema. no quiero hacer una DLL, porque esto probablemente me crea un problema con la tercera proyecto, un instalador de ventanas (para el servicio) donde tengo que utilizar la ruta ExecutingAssembly ...

¿Hay alguna manera para compartir el código sin hacer un dll por separado? Vínculos estáticos automáticos, por así decirlo?

+0

En vista y los enlaces simbólicos más nuevos pueden ser útiles. – CodesInChaos

+0

@CodeInChaos, no hay forma de almacenar enlaces simbólicos en el control de fuente/copias de seguridad fácilmente, estás haciendo las dos cosas, ¿verdad? =) – Rob

+0

http://stackoverflow.com/questions/954560/what-does-git-do-to-files-that-are-a-symbolic-link suena como git almacena sym-links como sym-links. Sin embargo, no tengo idea de si funciona en Windows, ya que aún no uso vista. Y dependiendo del caso de uso, podría ser suficiente agregar el sym-link al archivo de ignorar y crearlo manualmente para cada codificador. Un poco hackish, pero debería funcionar. – CodesInChaos

Respuesta

29

How about adding a file as a link.

En Visual Studio, haga clic derecho en su proyecto de aplicación de prueba de la consola -> seleccione Agregar archivo existente -> en el archivo añadir navegar diálogo para archivos en su proyecto de servicio de Windows real -> seleccione el archivos que desea compartir -> y en el botón Agregar, seleccione agregar como opción de enlace.

+2

¡Ese triángulo desplegable sneeky en el botón Agregar es bastante difícil de detectar! Muy útil si quieres una biblioteca compartida para Android y Windows con el mismo código, pero diferentes contenedores de proyectos. – AndyM

+0

puede por favor échele un vistazo aquí http://stackoverflow.com/questions/21301360/share-properties-from-child-app-to-base-project – Goofy

2

¿Qué hay de modificar de mano los archivos de proyecto para que señale al mismo archivo fuente?

Otra opción: coloque ambos proyectos en la misma carpeta. Agregue una clase a uno, luego en el otro proyecto agregue la clase existente y apunte a la clase que acaba de crear.

2

Usted podría:

  • mantener el código compartido en un proyecto independiente que produce una DLL y luego usar una herramienta como ILMerge para convertir el archivo DLL & EXE en una asamblea.
  • comparta los archivos de origen entre varios proyectos, ya sea modificando los archivos de proyecto o haciendo algo funky con el diseño del árbol de fuentes.

Dicho todo esto, la mejor manera de abordarlo sería tomar el control de la bala y almacenar el código compartido en un ensamblado compartido (DLL). ¿Qué sucede cuando decides, por ejemplo, exponer este código a través de un servicio WCF? Comienza a ser más complicado, ya que tiene 3 lugares que hacen referencia a los mismos archivos de código. No piense solo en lo que le hace la vida más fácil ahora, piense en lo que hará que su vida (y la de cualquier otra persona que tenga que mantener el código) sea más fácil en el futuro también. =)

+0

ILMerge es demasiado automático (a menos que haya una manera fácil de automatizarlo).Decidí por 'algo funky' (= agregar el archivo como un enlace). En cuanto al último párrafo, todos los argumentos válidos y buenos, pero no quiero un dll por los motivos mencionados. Además, tendría que compilar el proyecto dll cada vez que haga un cambio, mientras de esta manera, solo puedo presionar el botón de ejecución. No sé sobre sourcesafe, pero en el peor de los casos, los enlaces se vuelven a agregar rápidamente. –

+0

, por supuesto, puede automatizar ILmerge en el evento posterior a la construcción, ejecutándolo desde la línea de comando –

+0

@StefanSteiger. ¿Se da cuenta de que al presionar el botón ejecutar = compilar y ejecutar, ¿verdad? Si hay cambios pendientes, volverá a compilar el proyecto y los proyectos dependientes en la misma solución antes de que se ejecute. – Dan

9

Puede agregar un archivo a un proyecto como un enlace. En el diálogo Agregar elemento existente, el botón Agregar tiene un menú desplegable a la derecha. Utilice esta opción para seleccionar "Agregar Enlace":

alt text

poner el archivo como un elemento de solución y añadir al menos un enlace a cada proyecto.

0

Si desea compartir funcionalidad, debe utilizar un archivo DLL o similar.

Dado que lo que desea compartir es la fuente , lo que esencialmente está compartiendo es compartir archivos. Entonces puede hacerlo haciendo que sus proyectos hagan referencia a fuentes externas o puede hacer que su control de fuente haga esto por usted.

Si está utilizando Visual SourceSafe, puede hacer un enlace entre dos carpetas. VSS se asegurará de que sean tratados como el mismo archivo.

0

Voy a describir la configuración que usamos para administrar y probar nuestros proyectos de servicio de Windows. Si bien esto no responde a la pregunta de "compartir código sin una DLL" (la respuesta de Unmesh se encarga de eso), creo que el OP probablemente no se dé cuenta de lo fácil que es con una DLL. En cualquier caso, espero que ayude alguien.


Crear una solución, LDAPSync. Crear tres proyectos en esta solución:

  • LDAPSyncLib
  • LDAPSyncSvc
  • LDAPSyncTest

LDAPSyncLib es un proyecto DLL que contiene toda la lógica de negocio y la funcionalidad principal.

LDAPSyncSvc es un proyecto de servicio de Windows que contiene dos clases, una clase controlador de servicio que hereda de ServiceBase, y una clase para su servicio. Este proyecto tiene una "referencia de proyecto" a LDAPSyncLib.

LDAPSyncTest es una aplicación GUI (WinForms, WCF, etc.) o una aplicación de consola, según sus necesidades. Este proyecto también tiene una "referencia de proyecto" a LDAPSyncLib. Su único propósito es proporcionar alguna interfaz que le permita realizar fácilmente las llamadas requeridas en su lógica comercial para fines de prueba. En Visual Studio, configure esto como su "Proyecto de inicio".

Ahora, cuando ejecuta depuración a través de Visual Studio, obtendrá una pequeña GUI o ventana de comando que puede usar para realizar llamadas de prueba manualmente. Cuando lo instala como un servicio de Windows, la clase de controlador del proyecto LDAPSyncSvc tomará el control y manejará todas las solicitudes de servicio necesarias (inicio, detención, pausa, etc.)

Tenemos aproximadamente 30 proyectos de servicio de Windows internos que hemos estado gestionando, desarrollando y probando continuamente durante más de una década y este flujo de trabajo ha demostrado ser muy valioso para encontrar y corregir rápidamente errores cuando surgen. La mejor de las suertes con su proyecto y espero que esto ayude a algunos futuros Googlers.

Cuestiones relacionadas