2012-01-18 11 views
5

Estamos construyendo una aplicación .NET donde cargamos ensamblados de código externo ("complementos"). Hasta este momento, estábamos cargando estos ensamblajes en un único dominio de aplicación (principal).Cómo manejar el intercambio de datos de dominio de aplicación cruzada

Nos gustaría poder descargar un conjunto después de que se haya cargado.

Para este fin, estamos diseñando un sistema que creará un AppDomain secundario independiente para alojar los ensamblados de complementos, que se descargarán a voluntad.

Los problemas que tenemos con este enfoque:

  1. El plugin DLL necesidad de interactuar con las clases en el dominio de aplicación principal (registrador, por ejemplo).
  2. Los datos que se envían al plugin dll no están necesariamente marcados como Serializable ni se derivan de MarshalByRefObj.

¿Hay alguna práctica común de particionar la aplicación en tales casos? ¿Cuál es la mejor solución que podríamos buscar?

Otra pregunta interesante: ¿por qué MarshalByRef no se rige por un atributo y nos obliga a derivar de un objeto?

+1

'Nos gustaría poder descargar un conjunto después de que se haya cargado'' http://stackoverflow.com/questions/6258160/unloading-the-assembly-loaded-with-assembly-loadfrom 1. Para interactuar a través de por separado AppDomains es probable que tengas que hacerlo a través de Remoting. 2. es una afirmación, ¿podrías editar para aclarar esa segunda pregunta? –

Respuesta

3

La forma más sencilla de comunicarse en AppDomains es usar AppDomain.CreateInstanceAndUnwrap. Esto le permitirá instanciar un objeto en otro AppDomain y devolver un proxy a ese objeto. Desde el proxy, puede realizar efectivamente llamadas a métodos en todo el dominio de la aplicación.

Si sus clases actuales no se extienden a MarshalByRef, entonces debe crear una clase puente que lo haga y pueda actuar como un intermediario.

Cuestiones relacionadas