Acceso a los tipos de un ensamblado

11/05/2004 - 19:04 por josecarloyplancharlo | Informe spam
Mi gran problema es el siguiente:

Tengo un proyecto que llama a un DLL llamado Repositorio, el cual
recibe el tipo de una interfaz y tras buscar en un XML, obtiene la
clase que implementa dicha interfaz: algo así

// Proyecto en C#

void main(..){
...
Interfaz i = (Interfaz)(Repositorio.CrearImplementacion(typeof(Interfaz)));
...
}

// fin proyecto en C#

-

// DLL Repositorio

static object CrearImplementacion( Type Itype ){
... // busqueda en el XML

Assembly componente = Assembly.LoadFrom( DireccionDLL );
object obj = component.CreateInstance( Itype.Name );
return obj;

}

// Fin DLL

-

Es decir, una aplicación normal ( con la definición de la interfaz )
llama a un método estático de un DLL ( cargado previamente con Agregar
Referencia ) con un tipo que conoce ( Interfaz ).

El problema es que Repositorio que es un DLL llama a otro DLL y en la
depuración del proyecto observo que obj si contiene la clase que
implementa la Interfaz, pero surge una excepción del tipo "No se puede
convertir explicitamente", es decir, no puede hallar la definición de
la clase que implementa la interfaz.

Una solución que si conseguí es que en el proyecto la Interfaz i sea
object i, de tal forma que para acceder a los métodos del objeto
tendría que utilizar InvokeMember(), pero mi intención no es esa. Un
ejemplo:

// Proyecto C#

interface IPersona{
void SetNombre( string );
void SetEdad( int );
}

void main(){
IPersona p = (IPersona)Repositorio.CrearImplementacion(typeof(IPerson));
p.SetNombre( "Juan" );
p.SetEdad( 25 );
}

// Fin proyecto C#

mi intención es la siguiente:

1.- Repositorio.CrearImplementacion recibe un tipo, mediante el cual
busca en un XML qué DLL tiene implementado la clase Persona.
2.- Si lo ha encontrado, carga el DLL y crea un objeto de tipo
Persona, puesto que no se pueden crear objetos de una interfaz.
3.- Dicho objeto de la clase Persona se devuelve al proyecto y se
pueden ejecutar los métodos de la interfaz, puesto que tengo en el
objeto devuelto por el repositorio una implementación para dicha
interfaz.


Pero no puedo hacer la conversión.
Cualquier sugerencia tanto que funcione como que no será muy
agradecida. Gracias !!!

Preguntas similare

Leer las respuestas

#11 Tristan
14/05/2004 - 12:30 | Informe spam
¿Has probado el ejemplo que he dejado en el siguiente mensaje?

Si te entiendo bien, estás definiendo IPersona dos veces, en Repositorio.dll
y en Persona.dll. Si haces eso tienes dos interfaces con el mismo nombre,
con los mismos métodos pero absolutamente diferentes desde el punto de vista
de .net.

Te sigo diciendo que lo que necesitas es que IPersona (solo IPersona) esté
en un ensamblado compartido, aunque la mejor manera de entenderlo es que
veas el ejemplo.

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#12 josecarloyplancharlo
18/05/2004 - 13:35 | Informe spam
Creo que ya he resuelto el problema y era básicamente como tú decías,
Tristan. El problema era que se definían dos interfaces iguales en el
diferentes NameSpace, luego para resolverlo he tenido que agregar como
referencia el Repositorio.dll, con la definición de la interfaz, tanto
al proyecto como al componente Persona.dll, de tal forma que en tiempo
de ejecución se crea un enlace entre la interfaz ( definida en tiempo
de compilación ) y la clase que lo implementa en tiempo de ejecución.

Haber si consigo otra solución más refinada !
Respuesta Responder a este mensaje
#13 Tristan
19/05/2004 - 23:28 | Informe spam
Pero es que no puedes encontrar una solución más refinada. La interface ha
de ser la misma y ha de ser referenciada en ambos proyectos.

T esigo diciendo que aunque se llaman igual y tengan los mismos métodos, si
provienen de dos ensamblados distintos, las clases o las interfaces son
distintas y no puede hacerse casting entre ellas. Es más a mi me parece
lógico que sea así.

Juan Carlos Badiola
MVP - C#
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida