Tengo una aplicación principal que carga algunos complementos. Estos complementos se cargan y ejecutan en dominios de aplicación separados utilizando una clase que hereda de "MarshalByRefObject"; Todo esto funciona bien¿De qué maneras puedo enviar datos de un complemento a través de un dominio de aplicación que desencadena un evento en la aplicación principal en C#?
Lo que necesito ahora es una forma de manejar cuando el complemento quiere que la aplicación principal haga algo y una forma de manejarlo de forma dinámica en la aplicación principal. Si la mejor manera es sondear el plugin para obtener una lista de comandos, entonces puedo hacerlo, aunque parece un poco complicado.
¿Cuáles son las mejores formas de enviar una solicitud desde el complemento a través del dominio de la aplicación a la aplicación principal?
ACTUALIZACIÓN
como una actualización de la cuestión, estoy buscando a enviar datos a través del dominio de aplicación que hace que la aplicación principal de hacer algo, como una operación de "Archivo-> Nuevo" o "GetSomeData() " llamada. Al hacer esto, necesito hacer que el complemento espere a que la aplicación principal complete lo que está haciendo, pero también puede decidir, lado de la aplicación principal, si ejecutará o no la función/evento solicitado.
Estaba haciendo esto pasando el complemento a una interfaz. Esta interfaz fue implementada por una clase en la aplicación principal que definió algunos eventos. La aplicación principal podría suscribirse a estos eventos y el complemento podría activar las funciones principales de la aplicación. El problema es que la interfaz solo hizo referencia a la clase tal como estaba cuando pasé la interfaz. Es decir, si he creado la clase sin eventos suscritos, a continuación, pasa a la interfaz de la siguiente manera:
CallbackClass myCallbackClass = new CallbackClass();
pluginInterface.HeresMyCallbackClass((ICallbackClass)myCallbackClass);
el plugin recibiría la interfaz, pero ningún cambio en la clase original no se propagan. Entonces agregar:
myCallbackClass.MyMainAppEvent += new MainEventHandler(MyMainAppFunction);
no cambiaría la versión del complemento del evento. El complemento podría hacer esto:
//code within plugin
ICallbackClass callToMainApp;
public HeresMyCallbackClass(ICallbackClass cbClass)
{
callToMainApp = cbClass;
}
public CallAMainAppFunction()
{
callToMainApp.CallTheSubscribedFunction(); //This is where it all goes wrong
}
... pero el evento que intenta llamar es nulo. Ahora bien, esto no es un problema si hago la aplicación principal suscribirse al evento en primer lugar, a continuación, pasar a la interfaz:
CallbackClass myCallbackClass = new CallbackClass();
myCallbackClass.MyMainAppEvent += new MainEventHandler(MyMainAppFunction); //Subscribe first
pluginInterface.HeresMyCallbackClass((ICallbackClass)myCallbackClass);
El plugin entonces podría llamar CallTheSubscribedFunction()
y el evento dispararía en la aplicación principal. Necesito poder suscribirme a eventos como este a pedido porque algunas cosas/eventos/datos en la aplicación principal están disponibles en diferentes momentos.
Por lo tanto, mucha información que estaba tratando de evitar tener que escribir, pero creo que mi pregunta era demasiado general en relación con mi problema.
Si alguien tiene sugerencias, por favor hágamelo saber. Una vez más, mi objetivo es permitir que el complemento active un evento en la aplicación principal, espere a que la aplicación principal finalice, luego continúe con su ejecución, donde la aplicación principal puede o no estar suscrita a los eventos.
Actualización 2
que dan cuenta de la información anterior está especializada a mi solicitud, pero estoy en busca de sugerencias generales también. Entonces, si usar subprocesos es una opción, avíseme cómo podría funcionar un caso general. Si otro caso funciona mejor y necesito rediseñarlo para implementarlo, hágamelo saber también. Solo estoy buscando sugerencias aquí. Gracias.
Canalizaciones con nombre, EventWaitHandle, WCF, Remoting. Elija uno :) Dependiendo de lo que necesite hacer, elija el que le proporcione el código más limpio. –
@Mike estás en el camino correcto, es decir, usando el patrón Observer. Probablemente solo necesites forjar algunos bordes ásperos. @Mikael, no hay necesidad de WCF ni de otro IPC fuera de proceso. El segundo dominio de la aplicación es hospedado por la aplicación principal, por lo que está en proceso de comunicación. –
@Shiv Kumar - ¿Por observador quiere decir sondear el plugin? –