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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  [Solucionado] Cargar DLL a memoria
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [Solucionado] Cargar DLL a memoria  (Leído 8,846 veces)
seba123neo


Desconectado Desconectado

Mensajes: 3.621


"No quiero creer, quiero saber" - Carl Sagan


Ver Perfil WWW
[Solucionado] Cargar DLL a memoria
« en: 15 Septiembre 2010, 02:58 am »

Hola, tengo una duda sobre como cargar una dll a memoria y asi usarla en el programa a la cual esta referenciada.

mi objetivo es embeber como recurso las dll dentro del .exe y asi al ejecutarse el programa cargar esas dll a memoria y usar el programa normalmente.

la DLL en cuestion es un control que te agrega varios controles en la barra de herramientas, botones, etc...todos personalizados.

ya he probado de los ejemplos basicos de ponerla como recurso y despues leerla y escribirla en el disco y asi el programa la carga bein, el tema de esto es que yo no quiero escribirla en el disco, quiero usarla desde memoria.

de ultima si hay problemas con esto de cargarla desde memoria, lo que me solucionaria el tema es que se escriba en el disco (como ya hice) pero que la tome bien desde cualquier parte, porque solo la toma desde el mismo directorio donde esta el .exe, habria que ver como decile que la saque de cualquier lado que se especifique.

tampoco puedo usar un LoadLibrary ya que yo no quiero ejecutar funciones que estan dentro de la dll, esta dll son botones personalizados, es como un control de usuario.

gracias desde ya.

saludos.


« Última modificación: 17 Septiembre 2010, 15:12 pm por [D4N93R] » En línea

La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson
[D4N93R]
Wiki

Desconectado Desconectado

Mensajes: 1.646


My software never has bugs. Its just features!


Ver Perfil WWW
Re: Cargar DLL a memoria
« Respuesta #1 en: 15 Septiembre 2010, 03:16 am »

Hola,

Bueno tienes que cargar el assembly en memoria, tienes que usar la clase Assembly en System.Reflection.

Supongo que ya sabes como embeber el assembly dentro del exe. Lo que tienes que hacer es sacar el byte[] y meterlo en Assembly.Load(byte[] aca)

Con eso debería funcionar porque queda cargado dentro del application domain, es lo mismo que pasa cuando referencias un assembly con VS.

Entonces deberias usar es AppDomain.CurrentDomain.Load() la sobrecarga que más te convenga. Sino funciona habrá que usar AppDomain.CurrentDomain.AssemblyResolve y pasarle el assembly cuando no lo encuentre..

Saludos!


En línea

seba123neo


Desconectado Desconectado

Mensajes: 3.621


"No quiero creer, quiero saber" - Carl Sagan


Ver Perfil WWW
Re: Cargar DLL a memoria
« Respuesta #2 en: 15 Septiembre 2010, 04:01 am »

Hola,

Bueno tienes que cargar el assembly en memoria, tienes que usar la clase Assembly en System.Reflection.

Supongo que ya sabes como embeber el assembly dentro del exe. Lo que tienes que hacer es sacar el byte[] y meterlo en Assembly.Load(byte[] aca)

Con eso debería funcionar porque queda cargado dentro del application domain, es lo mismo que pasa cuando referencias un assembly con VS.

Entonces deberias usar es AppDomain.CurrentDomain.Load() la sobrecarga que más te convenga. Sino funciona habrá que usar AppDomain.CurrentDomain.AssemblyResolve y pasarle el assembly cuando no lo encuentre..

Saludos!

gracias por responder [D4N93R] , vos sabes que ya habia probado con lo que me contas, pero se ve que me faltaba algo, ahora SI ya quedo andando...aca dejo el codigo fuente para los que esten buscando lo mismo, anda 100 %.

Código
  1. Imports System.IO
  2. Imports System.Reflection
  3.  
  4. Public Class Form1
  5.  
  6.    Public Sub New()
  7.  
  8.        ' Llamada necesaria para el Diseñador de Windows Forms.
  9.        InitializeComponent()
  10.  
  11.        ' Agregue cualquier inicialización después de la llamada a InitializeComponent().
  12.        AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf CargarLibreriaMemoria
  13.    End Sub
  14.  
  15.    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  16.        Dim i As New ClassLibrary1.Class1
  17.        Call i.Saludo()
  18.        i = Nothing
  19.    End Sub
  20.  
  21.    Private Function CargarLibreriaMemoria(ByVal sender As Object, ByVal args As ResolveEventArgs) As Assembly
  22.  
  23.        Dim vStream As Stream = Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("WindowsApplication1.ClassLibrary1.dll")
  24.        Dim vBuffer As Byte() = New Byte(vStream.Length - 1) {}
  25.  
  26.        vStream.Read(vBuffer, 0, vBuffer.Length)
  27.  
  28.        Dim vLibreria As Assembly = Assembly.Load(vBuffer)
  29.  
  30.        Return vLibreria
  31.    End Function
  32. End Class

obviamente antes hay que agregar la dll como "nuevo elemento existente" y ponerle en las opciones de compilación como "recurso embebido".

saludos y gracias.

saludos.
En línea

La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson
[D4N93R]
Wiki

Desconectado Desconectado

Mensajes: 1.646


My software never has bugs. Its just features!


Ver Perfil WWW
Re: Cargar DLL a memoria
« Respuesta #3 en: 15 Septiembre 2010, 05:38 am »

Puedes filtrar por el ResolveEventArgs, tiene una propiedad llamada Name, en donde te pide el nombre a resolver, en caso de que ese método se vuelva a llamar en otra oportunidad buscando otro assembly.

Saludos y que bueno que hayas resuelto el problema.
En línea

seba123neo


Desconectado Desconectado

Mensajes: 3.621


"No quiero creer, quiero saber" - Carl Sagan


Ver Perfil WWW
Re: Cargar DLL a memoria
« Respuesta #4 en: 15 Septiembre 2010, 18:42 pm »

gracias, anda bien , pero el tema es que justo para lo que necesito no anda, o sea el control es un usercontrol, compilado en dll obviamente,proba si queres crear un usercontrol simple con un boton dentro, lo compilas a dll, despues desde otro proyecto agregar como referencia la dll y agregar como recurso como ya dije antes la misma, insertar un usercontrol al formulario, y ahi si que no anda. tira el error de que no se puede cargar el ensamblado o recurso.

saludos.
En línea

La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson
[D4N93R]
Wiki

Desconectado Desconectado

Mensajes: 1.646


My software never has bugs. Its just features!


Ver Perfil WWW
Re: Cargar DLL a memoria
« Respuesta #5 en: 15 Septiembre 2010, 18:47 pm »

Bueno ahora lo pruebo, se me ocurre también que intentes meter ese control en tiempo de ejecución..

Voy a probar eso, pero de todos modos intenta lo que te dije.

Saludos!
En línea

seba123neo


Desconectado Desconectado

Mensajes: 3.621


"No quiero creer, quiero saber" - Carl Sagan


Ver Perfil WWW
Re: Cargar DLL a memoria
« Respuesta #6 en: 16 Septiembre 2010, 00:52 am »

me estoy rompiendo el mate, ya vi 20 mil ejemplos, creo que he visto que para cada dll hay que crear un Domain distinto...explico que son 3 dll en total las que necesito cargar, tambien claro que no tengo el codigo de las dll, o sea son dll ya compiladas , son controles de botones , combos..e.tc..los tengo puesto en un formulario a estos controles, el objetivo como explique es solo llevar el .exe , con las dll como recursos incrustados dentro y cargarlas a memoria para que se pueda usar, sino tira el basico error could not load assembly o recurse.

saludos.
En línea

La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson
[D4N93R]
Wiki

Desconectado Desconectado

Mensajes: 1.646


My software never has bugs. Its just features!


Ver Perfil WWW
Re: Cargar DLL a memoria
« Respuesta #7 en: 16 Septiembre 2010, 17:32 pm »

seba,

Bueno, pues a mi me funciona de la siguente manera:

Código
  1.        static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
  2.        {
  3.            Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream("LoadAssembly.UserControls.dll");
  4.  
  5.            return Assembly.Load(new BinaryReader(s).ReadBytes((int)s.Length));
  6.  
  7.        }
  8.  

Es lo mismo que hiciste tú , aunque si tienes varias dll referenciadas tienes que condicionar eso por args.Name que te da el nombre del assembly que te pide.

El Assembly lo referencio y también lo agrego al proyecto como un archivo y lo marco como Embedded Resource en el Build Action.

Un saludo!
En línea

seba123neo


Desconectado Desconectado

Mensajes: 3.621


"No quiero creer, quiero saber" - Carl Sagan


Ver Perfil WWW
Re: Cargar DLL a memoria
« Respuesta #8 en: 16 Septiembre 2010, 19:00 pm »

estas seguro que la libreria dll es un usercontrol ?? y si esa dll la agregaste a la barra de herramientas y lo has insertado en el formulario ??
En línea

La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson
[D4N93R]
Wiki

Desconectado Desconectado

Mensajes: 1.646


My software never has bugs. Its just features!


Ver Perfil WWW
Re: Cargar DLL a memoria
« Respuesta #9 en: 16 Septiembre 2010, 20:14 pm »

Sip! Ahora mi turno :P

Estás seguro de que estas regresando el assembly correctamente ?

Prueba ponerle esto: (Nota: no se si esté bien, no me acuerdo bien de la sintaxis de VB.Net)

Código
  1. Private Function CargarLibreriaMemoria(ByVal sender As Object, ByVal args As ResolveEventArgs) As Assembly
  2.  
  3.        Dim vStream As Stream = Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("WindowsApplication1.ClassLibrary1.dll")
  4.        IF vStream = Null Then
  5.           MessageBox.Show("Ups stream es null")
  6.        End IF
  7.        Dim vBuffer As Byte() = New Byte(vStream.Length - 1) {}
  8.  
  9.        vStream.Read(vBuffer, 0, vBuffer.Length)
  10.  
  11.        Dim vLibreria As Assembly = Assembly.Load(vBuffer)
  12.  
  13.        Return vLibreria
  14. End Function
  15.  
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

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