none
¿Es posible compartir variables entre proyectos de la misma solución en el escenario que explico? RRS feed

  • Pregunta

  • Verán, tengo 2 proyectos en la misma solución, puedo referenciar un proyecto desde el otro y cambiar el valor de la propiedad de un proyecto y obtener dicho valor en el otro. Es decir la comunicación entre ambos está bien, funciona.

    La consulta es, una vez establecida la referencia que vincula a los dos proyectos y por ejemplo definida una propiedad en un proyecto, cuyo valor puede ser actualizado desde el otro proyecto, yo deseo ejecutar el segundo proyecto desde dentro del primero pero a través de su ejecutable, o sea algo así:

    Process.Start("D:\Proyecto2.exe")

    ¿El cambio que se produzca en la propiedad compartida dentro de Proyecto2.exe se reflejará en el primer proyecto?

    Entiendo que si instancio el segundo proyecto en el primero a través de una clase sí funciona, pero de la forma que explico es posible también poder acceder a la propiedad del Proyecto2 o no? Ojalá se haya entendido lo que trato de hacer.

    miércoles, 27 de marzo de 2019 6:35

Respuestas

  • No, no se puede. Hay una diferencia muy grande entre las dos opciones:

    Cuando Desde una clase (definida en un proyecto) instancias otra clase (definida en otro proyecto o en el mismo, da igual), entonces las dos clases se cargan en memoria dentro del mismo proceso, y en consecuencia pueden acceder a las mismas zonas de memoria (compartir variables).

    Pero cuando usas Process.Start para lanzar el otro ejecutable, los dos ejecutables ruedan en dos procesos separados. El sistema operativo aísla en memoria los procesos, de manera que un proceso no puede acceder a la memoria de otro. Esto hace que no sea posible acceder desde un proceso a las variable del otro, que se encuentran en una zona aislada de memoria.

    Así que si necesitas compartir información entre dos procesos separados, no se puede hacer compartiendo variables, hay que usar algún mecanismo de comunicación inter-procesos que utilice los servicios del sistema operativo para transmitir datos desde un proceso al otro.

    • Marcado como respuesta James2016-2 miércoles, 27 de marzo de 2019 8:02
    miércoles, 27 de marzo de 2019 7:37
  • Efectivamente, guardar un archivo en disco y que el otro proceso lo lea seria "uno de los servicios" (sistema de archivos) que nos ofrece el sistema operativo. Pero hay muchas mas opciones. Por ejemplo, se podrian usar comunicaciones, bien sea directamente a traves de Sockets o a traves de alguna encapsuacion de mas alto nivoel construida por encima de los sockets, por ejemplo WCF u OWIN mas un WebClient. O se podria usar una cola de mensajes (MSMQ). O un Pipe. O memoria compartida, invocando mediante P/Invoke las APIs de Windows para que asigne el bloque compartido. Y seguro que hay muchas mas opciones. En general todas aportan mayor velocidad que usar un archivo, pero tambien son mas complicadas y requieren saber lo que se esta haciendo y escribir muchas lineas de codigo, en comparacion con el archivo que es facil de entender y se puede implementar con un par de lineas.
    • Marcado como respuesta James2016-2 miércoles, 27 de marzo de 2019 15:52
    miércoles, 27 de marzo de 2019 12:31

Todas las respuestas

  • No, no se puede. Hay una diferencia muy grande entre las dos opciones:

    Cuando Desde una clase (definida en un proyecto) instancias otra clase (definida en otro proyecto o en el mismo, da igual), entonces las dos clases se cargan en memoria dentro del mismo proceso, y en consecuencia pueden acceder a las mismas zonas de memoria (compartir variables).

    Pero cuando usas Process.Start para lanzar el otro ejecutable, los dos ejecutables ruedan en dos procesos separados. El sistema operativo aísla en memoria los procesos, de manera que un proceso no puede acceder a la memoria de otro. Esto hace que no sea posible acceder desde un proceso a las variable del otro, que se encuentran en una zona aislada de memoria.

    Así que si necesitas compartir información entre dos procesos separados, no se puede hacer compartiendo variables, hay que usar algún mecanismo de comunicación inter-procesos que utilice los servicios del sistema operativo para transmitir datos desde un proceso al otro.

    • Marcado como respuesta James2016-2 miércoles, 27 de marzo de 2019 8:02
    miércoles, 27 de marzo de 2019 7:37
  • mm, ese es el problema, no se puede entonces. A qué se refiere con usar los servicios del S. O. para transmitir datos, guardarlos de manera externa a través de un archivo, por ejemplo, ¿para que el otro .exe pueda acceder?, ¿o qué otra alternativa habría?
    miércoles, 27 de marzo de 2019 8:02
  • Efectivamente, guardar un archivo en disco y que el otro proceso lo lea seria "uno de los servicios" (sistema de archivos) que nos ofrece el sistema operativo. Pero hay muchas mas opciones. Por ejemplo, se podrian usar comunicaciones, bien sea directamente a traves de Sockets o a traves de alguna encapsuacion de mas alto nivoel construida por encima de los sockets, por ejemplo WCF u OWIN mas un WebClient. O se podria usar una cola de mensajes (MSMQ). O un Pipe. O memoria compartida, invocando mediante P/Invoke las APIs de Windows para que asigne el bloque compartido. Y seguro que hay muchas mas opciones. En general todas aportan mayor velocidad que usar un archivo, pero tambien son mas complicadas y requieren saber lo que se esta haciendo y escribir muchas lineas de codigo, en comparacion con el archivo que es facil de entender y se puede implementar con un par de lineas.
    • Marcado como respuesta James2016-2 miércoles, 27 de marzo de 2019 15:52
    miércoles, 27 de marzo de 2019 12:31
  • Ya veo, alternativas más eficientes pero más complejas que requieren mayor esfuerzo de programación y creo que para un dato no vale la pena. Gracias por la respuesta.
    miércoles, 27 de marzo de 2019 15:52