Obtener una Instancia a una DLL creada en vb.NET

30/01/2006 - 21:08 por Bio | Informe spam
Hola.

Tengo el siguiente código:

oAss = Reflection.Assembly.LoadFrom(Ficheros(i))
oObj = oAss.CreateInstance("cCovers01.cCovers")

Al parecer funciona, pero no puedo acceder ni a los procedimientos, ni
a los métodos, ni a los eventos de la clase que se supone acabo de
crear... O quizá es que no se hacerlo. Por ejemplo, sería algo como:

oObj.Busqueda = "prueba"
oObj.Buscar()

¿? Algo me dice que no. Agradecería ayuda en el tema.
Gracias.
Juan Carlos.

Preguntas similare

Leer las respuestas

#1 Jesús López
31/01/2006 - 09:09 | Informe spam
Si oObj está declarado como Object, Option Strict está en Off y Busqueda y
Buscar son miembros públicos de la clase cCovers01.cCovers entonces
funcionará el código que has puesto. Por detrás el compilador de VB.NET
generará código que hace uso de reflection para acceder a esos miembros de
la clase.

Ahora bien, ¿cuales son las razones por las que cargas el ensamblado por
Reflection? Reflection es lento y una llamada mal hecha, por ejemplo si en
vez de poner oObj.Busqueda pones oObj.Bisquida, el error no se detectará en
tiempo de compilación. Quizá si nos das más detalles te podríamos dar
alguna idea que haría el programa más rápido, se evitaran los problemas
relacionados con las errores de mecanografía y estuviera disponible
IntelliSense.


Saludos:

Jesús López
MVP

"Bio" escribió en el mensaje
news:
Hola.

Tengo el siguiente código:

oAss = Reflection.Assembly.LoadFrom(Ficheros(i))
oObj = oAss.CreateInstance("cCovers01.cCovers")

Al parecer funciona, pero no puedo acceder ni a los procedimientos, ni
a los métodos, ni a los eventos de la clase que se supone acabo de
crear... O quizá es que no se hacerlo. Por ejemplo, sería algo como:

oObj.Busqueda = "prueba"
oObj.Buscar()

¿? Algo me dice que no. Agradecería ayuda en el tema.
Gracias.
Juan Carlos.
Respuesta Responder a este mensaje
#2 Bio
31/01/2006 - 09:33 | Informe spam
Hola Jesús.

Gracias por responder. Te explico lo que quiero hacer.

Tengo que crear diferentes dll's que conecten con diferentes bases de
datos, según el tema. Por ejemplo, imagina que tenemos dos temas:
Animales y Plantas. Para las consultas me creo 5 dll's, 3 que conectan
con 3 bases de datos distintas sobre animales, y 2 sobre plantas.
Tendría lo siguiente:

animales01.dll
animales02.dll
animales03.dll

plantas01.dll
plantas02.dll

Me gustaría que al inicio de mi aplicación, se detectaran dichas dll,
ya hayan 5 o 50, crearlas dinamicamente, y realizar consultas sobre
ellas en tiempo de ejecución.
La idea era comprobar cuantas dll's de animales hay al iniciar la
aplicación, y meter las instancias de los objetos que cree de ellas en
un objeto collection. Así, cuando realice alguna busqueda de animales,
recorrería el objeto collection utilizando el parametro Buscar y el
Método Búsqueda.

Las propiedades, métodos y eventos de todos los objetos son los
mismos, solo que por dentro trabajan de distintas maneras según la
base de datos a la que ataquen.

Un Saludo y Gracias de nuevo.
Juan Carlos.
Respuesta Responder a este mensaje
#3 Jesús López
31/01/2006 - 10:07 | Informe spam
Si accedes a todas las clases que tienes en esas dll de la misma manera. Lo
ideal sería definir un interfaz o interfaces que tienen que implementar las
clases.

Por ejemplo en un proyecto de librería de clases llamado Interfaces
tendríamos la interfaz:

Public Interface IBuscador
Property Busqueda As String
Sub Buscar()
Event Terminado As EventHandler
End Interface

Todas las dll's de animales y plantas tienen una referencia a Interfaces.dll
y la aplicación Windows también.

En la aplicación Windows entonces es más fácil y eficiente acceder a los
métodos de las clases de esas dll's:

Dim Asm1 As [Assembly] = Reflection.Assembly.LoadFrom(Ficheros(i))
Dim Buscador1 As IBuscador =
Asm1.CreateInstance("cCovers01.cCovers")
AddHandler Buscador1.Terminado, AddressOf BusquedaTerminada 'Aquí
tenemos IntelliSense
Buscador1.Busqueda = "Mr. Jinks" 'Aquí tambíen
Buscador.Buscar() 'Y aquí

Private Sub BusquedaTerminada( Sender As Object, e As EventArgs)
MsgBox "Búsqueda terminada"
End Sub


¿Estás usando Visual Basic 2003 ó 2005?

Si es 2005, podrías tener los objetos buscadores en una colección genérica.
Además yo encapsularía todo en una única clase:

Public Class SuperBuscador
Private Shared Buscadores As New List Of(IBuscador) ' si no es 2005
usaría un ArrayList


Public Shared Sub CargarBuscadores()
Buscadores.Clear
Por cada dll en el directorio
Dim Asm As [Assembly] = Reflection.Assembly.LoadFrom(
LaDll )
Dim buscador As IBuscador = Asm.CreateInstance( Nombre de la
clase incluida espacio de nombres)
Buscadores.Add (buscador)
Siguiente dll
End Sub

Public Shared Sub Buscar( Busqueda As String)
For Each buscador as IBuscador In Buscadores
buscador.Busqueda = Busqueda
buscador.Buscar
Next
End
End Class


Así, al principio del programa, cuando se carge el formulario pricipal o en
el evento Application.Start:

SuperBuscador.CargarBuscadores()

Y luego a la hora de buscar:

SuperBuscador.Buscar( "Mr. Jinks")


Saludos:

Jesús López
MVP

"Bio" escribió en el mensaje
news:
Hola Jesús.

Gracias por responder. Te explico lo que quiero hacer.

Tengo que crear diferentes dll's que conecten con diferentes bases de
datos, según el tema. Por ejemplo, imagina que tenemos dos temas:
Animales y Plantas. Para las consultas me creo 5 dll's, 3 que conectan
con 3 bases de datos distintas sobre animales, y 2 sobre plantas.
Tendría lo siguiente:

animales01.dll
animales02.dll
animales03.dll

plantas01.dll
plantas02.dll

Me gustaría que al inicio de mi aplicación, se detectaran dichas dll,
ya hayan 5 o 50, crearlas dinamicamente, y realizar consultas sobre
ellas en tiempo de ejecución.
La idea era comprobar cuantas dll's de animales hay al iniciar la
aplicación, y meter las instancias de los objetos que cree de ellas en
un objeto collection. Así, cuando realice alguna busqueda de animales,
recorrería el objeto collection utilizando el parametro Buscar y el
Método Búsqueda.

Las propiedades, métodos y eventos de todos los objetos son los
mismos, solo que por dentro trabajan de distintas maneras según la
base de datos a la que ataquen.

Un Saludo y Gracias de nuevo.
Juan Carlos.
Respuesta Responder a este mensaje
#4 Bio
31/01/2006 - 14:44 | Informe spam
Hola Jesús...

Me has dejado sin palabras, muchísimas gracias, esa solución es
perfecta! No conocía la existencia de interfaces, estoy empezando con
.NET y la verdad es que me solucionan el problema compeltamente!

Una última pregunta para seguir abusando de tus conocimientos si me lo
permites...

¿Como hago para controlar el evento Finalizado? Quiero decir...

Imagina que busco "perro" y le mando esa búsqueda a los 3 objetos. El
evento finalizado es importante para mi, por que una de las propiedades
que tambien existen en dichos objetos es "Resultado" que me indica el
número de coincidencias, entre otras cosas. Al recibir el evento antes
sabía quien había finalizado, y cuantos registros había encontrado.
¿Como recibiré ahora el evento?

Muchisimas gracias, con tu ayuda ya tengo trabajo para rato.
Respuesta Responder a este mensaje
#5 Jesús López
31/01/2006 - 15:06 | Informe spam
Te lo he puesto en el primer ejemplo, ¿no te has dado cuenta?

Con esta línea de código "enganchas" el evento Terminado del objeto
Buscador1 al procedimiento de evento BusquedaTerminada:

AddHandler Buscador1.Terminado, AddressOf BusquedaTerminada

El procedimiento de evento es este:

Private Sub BusquedaTerminada( Sender As Object, e As EventArgs)
MsgBox "Búsqueda terminada"
End Sub


El Objeto Sender es el objeto que provocó el evento, así que podrías hacer:

Private Sub BusquedaTerminada( Sender As Object, e As EventArgs)
Dim buscador as IBuscador = Sender
If buscador.Resultado no está vacío
MsgBox buscador.Resultado
endif
MsgBox "Búsqueda terminada"
End Sub

Todo esto suponiendo que los eventos estén definidos y funcionen como deben
, es decir, en el interfaz, el evento Terminado está definido como
EventHandler y las clases que implementan el interfaz, cuando lanzan el
evento, establecen contectamente Sender.

Saludos:

Jesús López
MVP

"Bio" escribió en el mensaje
news:
Hola Jesús...

Me has dejado sin palabras, muchísimas gracias, esa solución es
perfecta! No conocía la existencia de interfaces, estoy empezando con
.NET y la verdad es que me solucionan el problema compeltamente!

Una última pregunta para seguir abusando de tus conocimientos si me lo
permites...

¿Como hago para controlar el evento Finalizado? Quiero decir...

Imagina que busco "perro" y le mando esa búsqueda a los 3 objetos. El
evento finalizado es importante para mi, por que una de las propiedades
que tambien existen en dichos objetos es "Resultado" que me indica el
número de coincidencias, entre otras cosas. Al recibir el evento antes
sabía quien había finalizado, y cuantos registros había encontrado.
¿Como recibiré ahora el evento?

Muchisimas gracias, con tu ayuda ya tengo trabajo para rato.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida