.NET Reflection – Cargando un ensamblado de forma dinámica « Devthisblog

Devthisblog Desarrollo .net, Diseño Web, Seguridad… Y todo lo que se me vaya ocurriendo…

abril 7, 2014

.NET Reflection – Cargando un ensamblado de forma dinámica

Filed under: .net,ASP.Net,Curso C#,Programación — Etiquetas: , , , — jnavero @ 7:59 pm

Anteriormente en el blog hemos visto como recorrer propiedades de una clase, de forma que además de poder ver información sobre ellas podemos recuperar o darle un valor nuevo a cada una de las propiedades.

En este post, quiero finalizar el espacio de nombres Reflection con una carga dinámica de una aplicación .NET. Como comenté en los anteriores este espacio de nombres es muy grande y se pueden hacer muchísimas cosas. Aunque no todo es precioso y bonito en el, debemos tener en cuenta que Reflection es “lento”.

Veamos el siguiente código:
(Debajo la explicación)

 vb.net | 
 
 copy code |
?

01
Public Class Form1
02
 
03
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
04
        Dim t As New Thread(New ParameterizedThreadStart(AddressOf ExecuteResourceExe))
05
        t.Start("AplicacionEjemplo.exe")
06
        Application.[Exit]()
07
    End Sub
08
 
09
    Public Shared Sub ExecuteResourceExe(NombreDelRecurso As Object)
10
 
11
        Dim binary As Byte() = File.ReadAllBytes(NombreDelRecurso.ToString())
12
 
13
        Dim ensamblado As Assembly = Assembly.Load(binary)
14
        Try
15
            Dim metodo As MethodInfo = ensamblado.EntryPoint
16
            If Not metodo Is Nothing Then
17
                Dim parametros As String() = New String(0) {}
18
                parametros(0) = ""
19
                metodo.Invoke(Nothing, New Object() {parametros})
20
            End If
21
            'Manejar un posible error 🙂
22
        Catch ex As Exception
23
        End Try
24
    End Sub
25
 
26
End Class
27

El código anterior, carga de forma dinámica una aplicación .NET ¿Qué quiero decir con esto?. Bien, en este caso estoy usando también un hilo para que la ejecución se realice en un hilo paralelo y la aplicación padre continúe hasta que deseemos, en el caso del ejemplo se cierra tras lanzar el hilo.

Nuestro Hilo: ExecuteResourceExe se le pasa un parámetro de entrada que es la ruta del fichero a cargar (AplicacionEjemplo.exe).

Nos situamos ahora en nuestro hilo de ejecución y vemos que cargamos el fichero en un array de bytes con File.ReadAllBytes(NombreDelRecurso.ToString()). A partir de ahora comenzamos a usar reflection.

La clase Assembly representa un ensamblado y con Assembly.Load(binary) cargamos el ensamblado que hemos cargado en nuestro array de bytes. Es decir, ahora mismo lo tendríamos en memoria).
Una vez cargado en Assembly, utilizamos la clase MethodInfo donde almacenamos un método concreto, en nuestro caso, como queremos cargar el ensamblado usamos en EntryPoint de la aplicación.

Como nota aclaratoria diré que el EntryPoint es el punto de entrada, podríamos decir que es el método main() de la aplicación.

Por ultimo, una vez que tenemos el método, con el método Invoke arrancaría la aplicación.

Hay que tener varias cosas en cuenta:
– La velocidad de ejecución no es la misma
– Si la aplicación usa dlls externas, deberíamos tenerlas en el mismo directorio para que todo funcione correctamente

Saludos y hasta la próxima!

No hay comentarios »

No comments yet.

RSS feed for comments on this post. TrackBack URL

Leave a comment

Powered by WordPress