Developer's Diary

7 abril, 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)

Public Class Form1

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Dim t As New Thread(New ParameterizedThreadStart(AddressOf ExecuteResourceExe))
t.Start("AplicacionEjemplo.exe")
Application.[Exit]()
End Sub

Public Shared Sub ExecuteResourceExe(NombreDelRecurso As Object)

Dim binary As Byte() = File.ReadAllBytes(NombreDelRecurso.ToString())

Dim ensamblado As Assembly = Assembly.Load(binary)
Try
Dim metodo As MethodInfo = ensamblado.EntryPoint
If Not metodo Is Nothing Then
Dim parametros As String() = New String(0) {}
parametros(0) = ""
metodo.Invoke(Nothing, New Object() {parametros})
End If
'Manejar un posible error :-)
Catch ex As Exception
End Try
End Sub

End Class

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!

Anuncios

2 comentarios »

  1. […] a través de la reflexión, se pueden acceder a métodos, propiedades o cualquier cosa que queramos de un ensamblado. En este caso estamos haciendo una llamada al punto de entrada del ensamblado (entrypoint) que llamará a nuestro  programa principal. Hace un tiempo cree un post que hablaba sobre cargar un ensamblado de forma dinámica que se puede ver aqui: https://devthisblog.wordpress.com/2014/04/07/net-reflection-cargando-un-ensamblado-de-forma-dinamica… […]

    Pingback por Estudiando un packer para .NET | Developer's Diary — 6 septiembre, 2015 @ 8:58 PM

  2. […] a través de la reflexión, se pueden acceder a métodos, propiedades o cualquier cosa que queramos de un ensamblado. En este caso estamos haciendo una llamada al punto de entrada del ensamblado (entrypoint) que llamará a nuestro  programa principal. Hace un tiempo cree un post que hablaba sobre cargar un ensamblado de forma dinámica que se puede ver aqui: https://devthisblog.wordpress.com/2014/04/07/net-reflection-cargando-un-ensamblado-de-forma-dinamica… […]

    Pingback por Estudiando un packer para .NET | Devthisblog — 17 diciembre, 2015 @ 9:53 PM


RSS feed for comments on this post. TrackBack URI

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

A %d blogueros les gusta esto: