Cargar DLL de forma dinámica

 

Problemática: Tengo una aplicación grande, y varios grupos de desarrolladores que necesitan incluir sus despliegues al mismo sistema. Es basado en WindowsForm, y estamos administrando los módulos a través de un formulario MDI.

Adicional es necesario que por cada usuario final que ingrese al sistema se cargue el formulario asociado a su perfil. Por lo tanto se plantea lo siguiente, tener una sola aplicación base donde estará el formulario MDI, para que los demás grupos de desarrolladores interactúen con este proyecto, cada grupo hará su proyecto basado en DLL, las mismas tendrán los procesos que a cada módulo corresponda con sus respectivas pantallas o formularios. Luego estas se incluirán dinámicamente al proyecto principal.

Pues bien, va lo primero, crear el aplicativo principal, es decir, el que tendrá el formulario MDI donde estarán los demás módulos.

Trabajaremos con Visual Studio 2013, un proyecto de tipo WindowsForm

TipoProyecto

Le damos un nombre, en este caso es Demo.WF.MDI, y agregamos un nuevo elemento al proyecto que sería un formulario tipo MDI que servirá como contenedor de los formularios de todos los equipos de trabajo que trabajan alrededor de este proyecto.

AgregaMDI

Quedaría así

ProyectoMDIDonde el formulario de nombre “Principal.cs” es precisamente el de tipo MDI que contendrá las demás ventanas.
El formulario “FrmInterna.cs” es el formulario que viene de forma predeterminada al crear el proyecto.
El archivo “App.config” es donde se imprimen configuraciones globales del proyecto y de los ensambladores que se referencian.

 

Y el archivo “Program.cs” es la clase de inicio del proyecto.

Listo, ahora agregamos a la solución otro proyecto tipo Ensamblador, este tipo de proyectos no tiene puntos de entrada como el anterior que es en el “Program.cs”

Sobre la solución se da clic derecho y en el menú vamos a la opción “Agregar” y luego “Nuevo Proyecto”.

AgregaDLL

Le damos un nombre a este proyecto y le damos aceptar, esto agrega a la solución el proyecto y queda como vemos en la siguiente figura.ProyectoDLL

Le he agregado 2 clases de tipo formulario para realizar este ejemplo, la “App01.cs” y la “App02.cs”

Adicional le he eliminado los archivos que vienen de forma predeterminada al crear un proyecto de este tipo.

A cada formulario agregado le he colocado un botón, la acción del mismo es salir del formulario (this.Close();).

Crearemos un pequeño modelo de objetos EF (EntityFramework) donde se incluirá la información del menú que se cargará de forma automática cuando inicie el sistema. Existirá un formulario de inicio de sesión, cuando ingrese el usuario 1 se cargarán todas las aplicaciones y el usuario 2 solo unas cuantas. No se creará el mantenimiento de estos perfiles, lo manejaremos directamente en la base de datos. Quizá haga otro post de este tema de perfiles.

AgregarComponentes Tenemos como quedaría el Proyecto, en el recuadro azul hemos creado una carpeta con nombre “Base”, en la cual hemos creado el modelo de objetos, a partir del mismo generamos la base de datos en un servidor de SQL Server, y adicional hemos creado un script para insertar la información necesaria para que el sistema opere, dado que este demo no contempla el mantenimiento de las tablas creadas.

En el recuadro café hemos creado el formulario que hará de inicio de sesión de nuestro Demo, es aquí donde cargaremos al usuario validado con su respectivo perfil, en el cual ya estará configurado los accesos por usuario.

Aquí está el modelo de objetos, como vemos tenemos 3 objetos: Usuario, Perfil y Funcionalidad, en el primero tendremos información del usuario que ingresará al sistema, este tendrá configurado un perfil y a su vez, dicho perfil tendrá asignado varias funcionalidades, las mismas solo abarcarán hasta definir qué formularios puede o no ver el usuario validado para efectos del Demo.

ModeloObjetos

A partir de aquí se generará la base de datos de forma automática, la misma creará 3 tablas asociadas a cada objeto y adicional 2 tablas más que harán de relaciones para los objetos, tal como se ve en la siguiente figura.

BaseDatos

En la tabla “Funcionalidad” está la información que se usará para cargar los formularios de forma dinámica, queda así:

FuncionalidadLos nombres son descriptivos, en el campo “Ruta” estoy ingresando la dirección física con el nombre de la DLL para cada instalación, obviamente para que esto funciones en cada máquina que se instale debe tener la misma dirección física. Para el campo “NombreLogico” no es más que el NameSpaces incluyendo el nombre de la clase Form a la que hacemos referencia para que se cargue. Esta tabla es recursiva, y cada registro tiene un registro asociado padre que es el menú de quién depende, si nos fijamos esta consta solo de 3 niveles.

Pues bien, así sería el proceso de como el usuario hace interacción con el sistema y como el sistema hace para cargar los formularios.

image De los procesos y subprocesos se explicará brevemente el tercero (inicia el logon y carga usuario con perfiles) y el sexto (carga los formularios por medio de los ensambladores).

Como dice el flujo desde el formulario MDI se pregunta si tenemos el usuario autenticado con la condición que tenga por lo menos asignado 1 perfil, sino es así pasa al Logon.

Proceso1 En el código, luego que el usuario validó su credenciales, asigna el objeto a “usuarioActivo” y empieza a realizar la construcción de los menús dependiendo de los perfiles. Como hicimos un modelo de objetos EF y relacionamos al usuario con los perfiles y este a su vez con las funcionalidades, si cargamos al usuario, el mismo trae consigo todos los objetos relacionados y podemos escribir código como el siguiente.

Proceso2 Luego agregamos los formularios al menú por medio del método “AgregaMenuHijo”

Proceso3 Ahora veremos la carga del ensamblado de forma dinámica, como vemos se le pasa la ruta física y el espacio de nombres incluido el nombre de la clase de tipo Form.

Proceso4 Y listo, de un formulario que en diseño se ve sin menú, luego se poblará con el menú según el perfil de la persona.

Resultado

Este es el resultado visual de nuestra demo. Si desean el fuente completo con base y datos de prueba, déjame tu correo.

Espero les sirva.

Anuncios

7 pensamientos en “Cargar DLL de forma dinámica

  1. David Contreras

    Muy buen tuto te dejo mi correo para que me puedas enviar tu codigo de ejemplo para analizarla gracias de antemano … excelente!!!

    Me gusta

    Responder

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s