Complementos de carga / descarga de C #

¿Hay alguna forma de tener complementos de ClassLibrary que se puedan cargar / descargar? La única forma que he encontrado es usando un AppDomain, pero eso anula el propósito ya que el complemento no puede usar la API de hosts.

preguntado el 16 de mayo de 11 a las 20:05

¿Puede explicar lo que quiere decir con "el complemento no puede utilizar la API de hosts"? -

Si el complemento hace referencia al Host, cuando lo carga en otro AppDomain, supongo que carga el Host nuevamente en ese AppDomain ya que no hay nada configurado. -

3 Respuestas

Sí, he hecho esto con 1.1 2.0 y 3.5. Además, MS ahora tiene MEF, que es probablemente lo que desea.

http://msdn.microsoft.com/en-us/magazine/ee291628.aspx

contestado el 17 de mayo de 11 a las 00:05

Cuando dice "el complemento no puede usar la API de hosts", ¿quiere decir que necesita sus complementos para acceder al código de su host? Si es así, parece que desea una dependencia circular, que no está permitida, ya sea que su código se pueda cargar / descargar dinámicamente o no. Si el complemento necesita acceso a la API del host, debe extraer una interfaz de esa API y colocarla en una biblioteca compartida a la que puedan acceder tanto los complementos como la aplicación host:

Plugin -> PluginLib <- Host

Luego, el host puede inyectar su objeto API en una propiedad / constructor del complemento para que el complemento pueda invocar los métodos API. Idealmente, sus bibliotecas de complementos no deberían tener dependencias en la biblioteca del host. Usar un AppDomain para carga / descarga dinámica debería estar bien una vez que se resuelvan sus problemas de dependencia.

contestado el 17 de mayo de 11 a las 00:05

El CLR solo puede descargar un dominio de aplicación completo, no un ensamblado. Sin embargo, no hay ningún problema para cargar el mismo ensamblado en varios dominios de aplicaciones.

Esto significa que puede inyectar una instancia de un tipo del ensamblado A en un nuevo dominio de aplicación donde carga el ensamblado B. B puede usar la instancia del ensamblado A para hablar con el dominio de la aplicación principal. Siempre que no pase ningún tipo del ensamblado B 'sobre el borde', podrá descargar el dominio de aplicación y eliminar el ensamblado B de la memoria.

Echa un vistazo a la MarshalByRefObject para obtener más información sobre cómo pasar instancias a través de las fronteras de AppDomain

contestado el 17 de mayo de 11 a las 01:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.