Crear un sistema de plug-Ings y scripts en mi aplicacion

Iniciado por Zeroql, 24 Abril 2010, 17:49 PM

0 Miembros y 1 Visitante están viendo este tema.

Zeroql

Buenas....
Bueno esas son mis preguntas...
Quisiera crear un sistema de plugins para mi aplicacion e implementar scripts externos...
Estoy realizando una biblioteca de funciones, pero quisiera que si alguien desea agregar una funcion o script para el mejoramiento de la aplicacion esta se pueda agregar a la aplicacion por medio de plugins y scripts....
Les agradezco mucho la ayuda....
Dime y lo olvido, enseñame y lo recuerdo, involucrame y lo aprendo.
/.-ZEROQL.-\   -----  #937675#


[D4N93R]

Bueno, nunca he hecho algo así, pero se me ocurre una idea ( no se si sea la mejor vía)

1.- Crea una librería de clases, en donde defines un SDK en el cual va a haber las siguientes clases:

       - Un Atributo para identificar las clases del api.
       - Un Clase base para identificar cada clase con la que vas a cargar la libreria y tener los métodos básicos de funcionamiento.

2.- Cuando crees un Addon, lo que haces es Heredar de la clase base y sobreescribir sus metodos base, luego decoras con los atributos, que si para darle un nombre y eso, que se yo xD

3.- Tu aplicacion necesita tener una ruta de Addons, para así escanear las dll (con la extensión que quieras) así agarras y cargas el assembly en memoria y lo ejecutas :D

Creo que de esa manera puedes hacer algo parecido para los scripts..

Saludos!
4.

raul338

Utiliza las clases Assembly y Reflection, sirven para eso mismo :P

Una vez queria escribir un tutorial sobre como hacer un sistema de plugins (lo se hacer :P, aunque nunca hice un programa "final" que lo implemente :rolleyes:) pero seba123neo me bajoneo con alguien que tenia la misma tecnica en ingles :¬¬ (jajaja es broma :xD)

Zeroql

D4N93R me gusta tu idea la implemetare, aunke por ahi encontre un ejemplo de uso de plugins pero vb 6.0, vamos a ver si se puede implementar algo asi en .net

raul338 Gracias por tu aporte, ensayare de amba formas a ver como me va. gracias
Dime y lo olvido, enseñame y lo recuerdo, involucrame y lo aprendo.
/.-ZEROQL.-\   -----  #937675#


Atrum

Hace poco tuve que hacer algo semejante, sinceramente este es un tema que me falta dominar, no es exactamente lo que necesitas , pero tal vez te sirva de algo como ejemplo, la intencion cuando hice esto fue tener controles personalizados con una funcion en especifico, como establecer automaticamente un papel tapiz de acuerdo a la hora, otro control que accesara a datos y presentara un registro de varios usuarios, etc... la especificacion para este proyecto fue que fuera posible que la aplicacion una vez ya implementada fuera posible actualizar las librerias que contienen los controles y agregar mas, asi que utilize este codigo, el cual ya lo tengo publicado en un blog, no se que tan correcto sea hacerlo asi, ya que he leido que lo mejor es cargar los ensamblados en nuevos dominios de aplicacion, pero asi resolvi esto en su momento, espero te sirva de algo.

Para empezar cree un nuevo proyecto de libreria de clases y como medida para estandarizar los nombres de los controles y los nombres de archivo sor los mismos, esto es por que hay que especificar el nombre de la clase que esta dentro del ensamblado (dll) de la cual deseas intanciar un objeto, y pues aqui como todo es dinamico, el intellisense no ayuda.

Asi que cree mi control y posteriormente lo genere, puse esta dll en el mismo directorio de mi aplicacion principal.

Entonces en mi aplicacion principal que seria la que carga los "plug-ins" le agrege esta funcion, si no me equivoco es necesaria la referencia System.Reflection

Código (vbnet) [Seleccionar]

Public Sub AddAssembly(ByVal Path As String)

'Declaro mi objeto del tipo Assembly, y cargo el fichero
'El cual es el path donde se ubica mi dll
Dim MyAssembly As Assembly = Assembly.LoadFile(Path)

'Como el nombre de mi control, mi ensamblado y mi clase son iguales
'la referencia para un control instanciado de la clase MyControl seria
'MyControl.MyControl asi que aqui simplemente extraigo el nombre de mi
'archivo sin la extension, se vera algo rudimentario pero funciona :)
Dim sClase As String = MyAssembly.ManifestModule.Name.Split(CChar("."))(0)

'Aqui obtengo la definicion del tipo de dato que tengo en mi Dll
Dim MyExtType As Type = MyAssembly.GetType(sClase & "." & sClase)

'Entonces creo la instancia nueva de acuerdo al tipo de dato obtenido
'la almaceno en mi objeto tipo object
Dim MyExtObj As Object = Activator.CreateInstance(MyExtType)

'Creo mi tabPage
Dim NewTabPage As New TabPage

'Aqui convierto mi objeto a control, probablemente esto deberia ir en
'un try catch para obtener alguna exepcion, por ejemplo que la DLL no contenga
'controles, entonces mi objeto no seria "casteable" a "control"
Dim MyControl As Control = CType(MyExtObj, Control)

'Agrego el nuevo control creado a mi TabPage
NewTabPage.Controls.Add(MyControl)

'Agrego el nuevo TabPage a mi TabControl
form.TabControl1.TabPages.Add(NewTabPage)

End Sub


Entonces con un for each  obtuve cada dll de un directorio e intente convertirlo a "control" para agregar cada dll en un tab page nuevo.

El unico problema de esto es que una vez cargado un ensamblado no se puede descargar a menos de que crees un AppDomain para cargarlo ahi y despues descargar el AppDomain. 

Espero esto te de un idea de como hacer tu sistema, y si algo esta mal acepto criticas.

Saludos

raul338

Exacto!

Que te sirva el codigo de Xtriker como base, Yo lo que hacia en mi "sistemita" era leer todas las dll que estaban dentro de la carpeta "plugins" :P con el Assembly, luego busco por el tipo "PluginInit" y el metodo "Init" que me devolvia un "menu" que ponia en la aplicacion, y bueno, despues ese menu llamaba a su metodo en el plugin correspondiente y eso era todo ;-D

Espero que te sirva la idea al menos, si quieres codigo yo te podre ayudar, lo que pasa es que ahora estoy corto de tiempo, y el codigo que tengo lo tengo que reformar porque lo hice hace mucho y con malas practicas (nombres de variables demasiado cortos, sin comentarios, etc etc :xD)

MANULOMM

lo de reflection es lo mejor, pero un recomendación para que no temates buscando metodos en clases que no conces haz por regla que las Dll's que sean PlugIns implementen por obligación una interfaz en la cual defines el metodo de inicio.
De esta forma podras instanciar la Dll de una forma mas sencilla pues conoces el metodo.

Atentamente,

Juan Manuel Lombana
Medellín - Colombia


raul338

Claro, es una idea mas  "punto netiana" (:huh:) jaja.... mi solucion anterior fue una idea asi, solo que yo implementaba una clase por defecto, es decir. La dll debe tener si o si una clase Plugin con 2 metodos obligatorios: el Init que devuelve el menu con info de otros metodos del plugin y el about :P

[D4N93R]

Exacto, Clases Base, Interfaces, o lo que sea, más Reflection.. es lo mejor para crear el sistema de plugins.. Saludos!