elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  SmartDll.dll
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: SmartDll.dll  (Leído 3,030 veces)
Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
SmartDll.dll
« en: 21 Julio 2010, 19:19 pm »

Buenas tardes/días/noches a todos xD me ha llamado mucho la atención lo de los plugings y addons que se puede hacer con System.Reflection en .Net así que he me puse a hacer una dll SmartDll.dll que sirviera para facilitar la comunicación entre el programa y los plugins de una manera más comoda, entonces vengo aqui a pedir consejos y opiniones mientras voy desarrollando el proyecto de tal manera que quede lo mejor posible, aqui está el source:

Para que no tengan que leerselo y analizarlo basicamente crea un objeto apartir de la dll a cargar comprobando que dentro de ella exista la clase Plugin
dentro de esta clase debe ir todo el contenido y además debe ser la clase principal y tambien el nombre de raiz y el del ensamblado del plugins deben ser los mismos, luego tenemos 2 funciones una que devuelve todos los controles dentro del plugin y otra que te devuelve solo los de un tipo en especifico por ejemplo solo los TextBox

Código
  1. Public Class Dll
  2.  
  3. #Region " Private "
  4.  
  5.    Private _
  6.    _DllInfo As FileInfo, _
  7.    _EntryPoint As String, _
  8.    _Assembly As Assembly, _
  9.    _ObjectType As Type, _
  10.    _ObjectInstance As Object
  11.  
  12. #End Region
  13.  
  14. #Region " Private Shared "
  15.  
  16.  
  17.  
  18. #End Region
  19.  
  20. #Region " Public "
  21.  
  22.    Public Sub New(ByVal Path As String)
  23.        Try
  24.            If IsSmartDll(Path) Then
  25.                _DllInfo = New FileInfo(Path)
  26.                _EntryPoint = New FileInfo(Path).Name.Split(CChar("."))(0) & "."
  27.                _Assembly = Assembly.LoadFile(Path)
  28.                _ObjectType = _Assembly.GetType(_EntryPoint & "Plugin")
  29.                _ObjectInstance = _Assembly.CreateInstance(_EntryPoint & "Plugin")
  30.            Else
  31.                Throw New Exception(Path & " not belongs to SmartDll")
  32.            End If
  33.        Catch ex As Exception
  34.            Throw New Exception(ex.Message, ex.InnerException)
  35.        End Try
  36.    End Sub
  37.  
  38.    Public ReadOnly Property FileInfo() As [FileInfo]
  39.        Get
  40.            Return _DllInfo
  41.        End Get
  42.    End Property
  43.  
  44.    Public Function GetControlsByType(ByVal FindType As Type) As List(Of Control)
  45.        GetControlsByType = New List(Of Control)
  46.  
  47.        For Each Objeto As PropertyInfo In _ObjectType.GetProperties
  48.  
  49.            Try
  50.  
  51.                If Objeto.PropertyType.Name = FindType.Name Then
  52.                    GetControlsByType.Add(CType(Objeto.GetValue(_ObjectInstance, New Object() {}), Control))
  53.                Else
  54.                    Continue For
  55.                End If
  56.  
  57.            Catch
  58.                Continue For
  59.            End Try
  60.  
  61.        Next
  62.  
  63.    End Function
  64.  
  65.    Public Function GetControls() As List(Of Control)
  66.        GetControls = New List(Of Control)
  67.  
  68.        For Each Objeto As PropertyInfo In _ObjectType.GetProperties
  69.  
  70.            Try
  71.                GetControls.Add(CType(Objeto.GetValue(_ObjectInstance, New Object() {}), Control))
  72.            Catch
  73.                Continue For
  74.            End Try
  75.  
  76.        Next
  77.  
  78.    End Function
  79.  
  80. #End Region
  81.  
  82. #Region " Public Shared "
  83.  
  84.    Public Shared Function IsSmartDll(ByVal Path) As Boolean
  85.        Try
  86.            Dim Dll As Assembly = Assembly.LoadFile(Path)
  87.  
  88.            Return Dll.GetType(New FileInfo(Path).Name.Split(CChar("."))(0) & ".Plugin") IsNot Nothing
  89.  
  90.        Catch
  91.            Return False
  92.        End Try
  93.    End Function
  94.  
  95. #End Region
  96.  
  97. End Class

Pueden decir que creen ustedes que hace falta, dudas, criticas o correcciones de errorres o recomendaciones de mejores practicas ;D

Notas:
  • Para que serviria llamar Subs y Funciones de un plugin?


En línea

La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...
[D4N93R]
Wiki

Desconectado Desconectado

Mensajes: 1.646


My software never has bugs. Its just features!


Ver Perfil WWW
Re: SmartDll.dll
« Respuesta #1 en: 21 Julio 2010, 20:02 pm »

Muy bien! pero (ups) yo creo que es mejor que crees un SDK para los plugines, más que un comprobador de manera de saber si está bien "redactado" el dll del plugin.

Me explico, Supongamos que tengo un programa (windows form) entonces quiero que se le añadan plugines, pero los plugines no solo son visuales, pueden ser muchas cosas más, por ejemplo cargar otra ventana o cierto comportamiento diferente.

Entonces tienes que proveer un sdk, que creo yo, debe consistir en una Interfaz. Sigamos con el ejemplo:

La interfaz:
Código
  1. public class AplicationManager
  2. {
  3.    // codigo principal de la aplicacion
  4.    public static AplicationManager Current { get; }
  5. }
  6.  
  7. public interface IPlugin
  8. {
  9.      void Init(AplicationManager appManager);
  10.      void OnExit();
  11.      public string Name {get; }
  12. }
  13.  

Entonces, AplicationManager es donde se maneja todo el comportamiento principal de la aplicación, y todo plugin debe implementar de IPlugin, así de esa manera:

Código
  1.  
  2. public class MySuperPlugin : IPlugin
  3. {
  4.      private AplicationManager m_appMgr =  null;
  5.      void Init(AplicationManager appManager)
  6.      {
  7.          m_appMgr = appManager;
  8.          System.Timers.Timer aTimer = new System.Timers.Timer(10000);
  9.          aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
  10.          aTimer.Interval = 2000;
  11.          aTimer.Enabled = true;
  12.      }
  13.  
  14.      private static void OnTimedEvent(object source, ElapsedEventArgs e)
  15.      {
  16.          m_appMgr.Current.SomeMethod();
  17.      }
  18.  
  19.      public void OnExit()
  20.      {
  21.           //supuestamente esto es un evento que se ejecuta cuando se está cerrando
  22.           //lla aplicacion, como? pues AplicationManager tiene la lista de plugines
  23.           //cargados, y los cierra uno por uno antes de salir
  24.           appManager.Current.XXXXX.XXX = "TEST";
  25.            // con esto quiero decir que tenemos acceso a la
  26.           //aplicación principal  en cualquier momento:)
  27.      }
  28.  
  29.      public string Name {get { return "My Super Plugin!!! v1.0"; } }
  30. }
  31.  
  32.  

Si no me expliqué bien, me dices y edito el post xD hehe saludos!


En línea

Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: SmartDll.dll
« Respuesta #2 en: 21 Julio 2010, 20:07 pm »

Si ya te entiendo tambien pense en eso pero me dio flogera xD obviamente se necesita que el plugin pueda tener acceso al programa que lo cargo, bueno seguiré trabajando y cualquier avance lo comunico, Gracias por tu respuesta ;)
En línea

La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...
[D4N93R]
Wiki

Desconectado Desconectado

Mensajes: 1.646


My software never has bugs. Its just features!


Ver Perfil WWW
Re: SmartDll.dll
« Respuesta #3 en: 21 Julio 2010, 20:11 pm »

Excelente, y tranquilo que parece más difícil pero no lo es, tener un ApplicationManager o el nombre que le pongas es muy importante y te ayuda mucho en el desarrollo de aplicaciones grandes. Un dato:

Código
  1.  
  2. public class AplicationManager
  3. {
  4.    private static AplicationManager m_appMgr = null;
  5.    public static AplicationManager Current
  6.    {
  7.        get
  8.        {
  9.             if(m_appMgr == null)
  10.                m_appMgr = new AplicationManager();
  11.             return m_appMgr;
  12.        }
  13.     }
  14.  
  15.    // despues todo el codigo principal de la aplicacion
  16. }
  17.  
  18.  

Con esto tienes :)
En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: SmartDll.dll
« Respuesta #4 en: 22 Julio 2010, 04:58 am »

Notas:
  • Para que serviria llamar Subs y Funciones de un plugin?

Serviria para darle uso al plugin, a mi se me habia ocurrido en su momento que devolviera una lista con las funciones (un menu para agregarlo al StripMenu) y de ahi que el usuario los llame cuando quiera :P
En línea

Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: SmartDll.dll
« Respuesta #5 en: 22 Julio 2010, 05:30 am »

Si, me llamo la atención fue ese tema donde tu y otro usuario respondian a otro que preguntaba como hacer un sistema de plugins.

D4N93R ahora que voy a la práctica me he enredado todo, las Interface si son realmente la mejor forma de crear un sistema de plugins, ya que he googleado y bueno es la alternativa que ofrecen todos, lo que no entiendo es como esto hace posible que me comunique con la aplicacion que cargo el plugin y tengo otra duda tengo que tener la interface en la aplicacion que carga los plugins y tambien en los plugin pero si cada uno es diferente (cada plugin) como la interface de la aplicacion princiapal tendra el mismo contenido que los plugins?

Quisas estoy todo confundido xD
En línea

La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...
[D4N93R]
Wiki

Desconectado Desconectado

Mensajes: 1.646


My software never has bugs. Its just features!


Ver Perfil WWW
Re: SmartDll.dll
« Respuesta #6 en: 22 Julio 2010, 05:56 am »

Si bueno, una vez que lo comprendas no es nada difícil :D

Usando el código anterior, supongamos que mi aplicación es un notepad, normal igualito que el de windows.

entonces, en vez de programar el comportamiento en Form1.cs xD lo programas todo en AplicationManager, un pequeño ejemplo:

Nota: Código sin Visual Studio.
Código
  1. public class Form1: Form
  2. {
  3.  
  4.   void Guardar_Click(object sender, EventHandler e)
  5.   {
  6.       //este es el método que maneja el evento click del botón guardar del formulario.
  7.       // En vez de hacer todo el código para guardar acá, haces:
  8.       AplicationManager.SaveDocument(textbox1.Text);
  9.       //ves? de esta manera todo el comportamiento de la aplicación ya no se hace en el form1 :D
  10.   }
  11.  
  12. }
  13.  

Ahora un sistema de plugins en el mismo código. Un plugin que saque un botón y muestre un formulario para ver las actualizaciones disponibles, y que también al cargar revise si hay actualizaciones
Código
  1. //para esto necesitamos que nuestro AplicationManager tenga acceso a todo, por eso:
  2. //otra cosa! los plugines están en AplicationManager, en una Lista, algo así List<IPlugin>
  3. // Y siempre son cargados antes de iniciar el formulario, esto lo haces en el Program.cs
  4. public class Form1: Form
  5. {
  6.  
  7.   void Form_Load(object sender, EventHandler e)
  8.   {
  9.       AplicationManager.Current.MainForm = this;
  10.  
  11.      // Obviamente en el AplicationManager tiene que haber una propiedad de tipo Form que se llame MainForm :D
  12.  
  13.  
  14.   }
  15.   void Guardar_Click(object sender, EventHandler e)
  16.   {
  17.       AplicationManager.Current.SaveDocument(textbox1.Text);
  18.   }
  19.  
  20. }
  21.  

Es muy importate que tengas eventos y métodos por todo el AplicationManager, de esta forma puedes hacer más cosas con los plugines.

Ahora el código de los plugines:

Código
  1. public class UpdatePlugin : IPlugin
  2. {
  3.   AplicationManager m_appMgr;
  4.   public void Update()
  5.   {
  6.      //Código para actualizar la aplicación
  7.   }
  8.   void Init(AplicationManager appManager)
  9.   {
  10.       m_appMgr = appManager;
  11.       Update(); //Este método se llama cuando se inicia la apliación porque al cargar los plugines se les debe llamar a éste método, o si quieres lo ahces en el constructor.
  12.  
  13.      //ahora agarramos el form de AplicationManager y buscamos el Menu donde queremos meter el control y listo:
  14.      AplicationManager.Current.MainForm.FindControl(..... // ahí te lo dejo, tengo sueño ya hehehe
  15.      //también puedes crear un método para agregar botones a un menu en específico, eso lo pondrías en el Application manager.. pero bueno es cuestión de programar y añadir detalles..
  16.   }
  17.   void OnExit()
  18.   {  }
  19.   public string Name {get { return "Updates Plugin" } }
  20.  
  21. }
  22.  
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines