Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - seba123neo

#1511
.NET (C#, VB.NET, ASP) / Re: Cargar DLL a memoria
17 Septiembre 2010, 06:48 AM
LISTOOOOOOOOOO  ;D ;D ;D , (paresco uno que recien empieza a programar y le sale el primer hola mundo jaja)

de tanto ver ejemplos comenze a ver como funciona realmente, puede que antes no lo tenia claro.

el error que estaba cometiendo es hacerlo en un formulario, o sea en el Load o el constructor del form, se ve que ahi no anda, porque el diseñador de windows forms lo carga antes de que yo haga la carga del assembly.

lo puse en un modulo con un Sub Main y funciona perfecto.

aclaro para el que no sabe que el evento AssemblyResolve se ejecuta cuando el programa no encuentra una dependencia, entonces ahi dentro del evento le podemos decir de donde sacar el assembly, si se lo pasamos mal obviamente se produce una excepción y se termina el programa.

como vos decias hay que usar el args.Name que devuelve la info del assembly que esta referenciado y no lo encuentra, este retorna el nombre de la libreria, la version, la cultura y el keytoken, algo asi:

Código (vbnet) [Seleccionar]
System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

entonces el codigo final queda asi:

Código (vbnet) [Seleccionar]
Imports System.IO
Imports System.Reflection

Module Module1
    Sub Main()
        AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf CargarLibreriaMemoria

        Application.EnableVisualStyles()
        Application.Run(Form1)
    End Sub

    Private Function CargarLibreriaMemoria(ByVal sender As Object, ByVal args As ResolveEventArgs) As Assembly

        Dim vNombre As String = args.Name.Substring(0, args.Name.IndexOf(","))

        Dim vStream As Stream = Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("WindowsApplication1." & vNombre & ".dll")
        Dim vBuffer As Byte() = New Byte(vStream.Length - 1) {}

        vStream.Read(vBuffer, 0, vBuffer.Length)

        Dim vLibreria As Assembly = Assembly.Load(vBuffer)

        Return vLibreria
    End Function
End Module


con eso lo que hago es solo sacar el nombre del ensamblado que esta antes de la primer coma, o sea:

System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

y listo con eso funciona...

obviamente debemos reemplazar WindowsApplication1 por el nombre de nuestro programa, yo lo puse asi fijo para ponerlo nomas, se puede averiguar desde codigo tambien.

si alguno quiere ver los nombres de los ensamblados que usa el programa lo puede ver asi:

Código (vbnet) [Seleccionar]
        For Each asm As Assembly In AppDomain.CurrentDomain.GetAssemblies()
            Dim name As String = asm.FullName.Substring(0, asm.FullName.IndexOf(","))
        Next


gracias por tu tiempo [D4N93R] , decime tu nombre porque no me gusta llamar por nick  ;D

saludos.
#1512
.NET (C#, VB.NET, ASP) / Re: Cargar DLL a memoria
17 Septiembre 2010, 01:14 AM
te parece mal si te pido que subas el proyecto con el codigo ?
#1513
eso es solo para megaupload y algunos mas, pero casi todos ya tienen un sistema que te retorna los valores, como si fuera un xml por decirlo asi...

saludos.
#1514
.NET (C#, VB.NET, ASP) / Re: Cargar DLL a memoria
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 ??
#1515
cada pagina de esas tiene un linkchecker, una direccion que le haces un post de los links y te devuelve una respuesta con un formato determinado para despues parsearlo desde tu aplicación y hacer...

justo yo estaba haciendo uno de rapidshare y demas servidores...por ahi fijate en internet esta libre el codigo de plugins del firefox linkchecker y ahi te muestra como se hace en todos los servidores.

saludos.
#1516
.NET (C#, VB.NET, ASP) / Re: Cargar DLL a memoria
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.
#1517
.NET (C#, VB.NET, ASP) / Re: Cargar DLL a memoria
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.
#1518
.NET (C#, VB.NET, ASP) / Re: Cargar DLL a memoria
15 Septiembre 2010, 04:01 AM
Cita de: [D4N93R] 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!

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 (vbnet) [Seleccionar]
Imports System.IO
Imports System.Reflection

Public Class Form1

    Public Sub New()

        ' Llamada necesaria para el Diseñador de Windows Forms.
        InitializeComponent()

        ' Agregue cualquier inicialización después de la llamada a InitializeComponent().
        AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf CargarLibreriaMemoria
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim i As New ClassLibrary1.Class1
        Call i.Saludo()
        i = Nothing
    End Sub

    Private Function CargarLibreriaMemoria(ByVal sender As Object, ByVal args As ResolveEventArgs) As Assembly

        Dim vStream As Stream = Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("WindowsApplication1.ClassLibrary1.dll")
        Dim vBuffer As Byte() = New Byte(vStream.Length - 1) {}

        vStream.Read(vBuffer, 0, vBuffer.Length)

        Dim vLibreria As Assembly = Assembly.Load(vBuffer)

        Return vLibreria
    End Function
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.
#1519
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.
#1520
Hardware / Re: ¿Cual será el problema?
31 Agosto 2010, 06:41 AM
a mi una vez me tiraba ese error a cada rato y no podia saber que era, al final era una memoria ram mala, la cambie y desaparecio el error. puede que lo tuyo no sea esto, pero te lo cuento nomas.

saludos.