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 !!!
Leer las respuestas