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 !!!
 

Leer las respuestas

#1 Octavio Hernandez
11/05/2004 - 20:34 | Informe spam
¿Seguro que la instancia que genera tu CrearImplementacion() implementa la
interfaz indicada? A priori no veo que problema podría haber, incluso si las
clases están en diferentes ensamblados.

Por ejemplo, este ejemplillo similar al tuyo produce la excepción 'No se
puede convertir' si se olvida hacer que Persona implemente IPersona, pero
funciona perfecto en caso contrario:
public interface IPersona

{

void Imprimir();

}

public class Persona // : IPersona

{

public Persona()

{

}

public void Imprimir()

{

MessageBox.Show("pepe");

}

}

public class Test {

public static void _Main(){

IPersona i = (IPersona)(CrearImplementacion(typeof(IPersona)));

i.Imprimir();

}

static object CrearImplementacion(Type Itype)

{

object obj = new Persona();

return obj;

}

}

"secharles" escribió en el mensaje
news:
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 similares