Dudas sobre System.Type en C# NET

16/09/2003 - 13:47 por enrique | Informe spam
Tengo un problema al crear una DLL utilizando reflexión
de .NET:

Tengo este código en una clase A de un proyecto Visual
Studio.

ClaseA
...
string cadenaTipoMiClase = "MiClaseB"
System.Type tipoMiClase = Type.GetType
(cadenaTipoMiClase);



ClaseA y ClaseB están en el mismo proyecto de Visual
Studio, y ese código funciona bien.


Ahora bien, si creo una Librería DLL cque contiene la
claseA, el código

...
string cadenaTipoMiClase = "MiClaseB"
System.Type tipoMiClase = Type.GetType
(cadenaTipoMiClase);


no funciona !!!!!!

En cambio si la clase A y la clase B están en la misma
DLL sí, repito síiiiiiii, funciona.


Cómo se puede hacer que ese código funcione estando
claseA en una DLL y claseB en mi proyecto de Visual
Studio,
el cual añade una referencia a esa DLL.


Otra cosa importante:

Por ejemplo, quisiera tener una clase que gestionase
Catálogos de Datos para la aplicación.
Es decir, una especie de HashTable con catálogos (de
datos cuyo indide de actualización es bajo, por ejemplo,
provincias
de España).

Como quiero que la clase sea utilizada tanto para Web
como para Cliente-Servidor, no sé cuál sería la mejor
forma de almacenar dichos catálogos. (En el Application
seria buena no?, pero solo existe para Web).

Quizá una clase con un atributo static que tuviera todos
los catálogos sería eficiente y util ??

Es decir, tendría una clase con un atributo static de
tipo HashTable, que va a contener todos los catálogos, es
decir,
al ser estático estaría disponible para toda la
aplicación tanto web como cliente-servidor, no?.


Lo que me pregunto es si para Web sería eficiente en
cuanto a rendimiento. O si hay alguna otra opción mejor
que la que os planteo.


Muchísimas gracias.

Preguntas similare

Leer las respuestas

#1 Ignacio Nicolás Rodríguez
16/09/2003 - 14:31 | Informe spam
Antes que nada, Enrique, deberías hacer de a una pregunta por vez. Esto
ayuda no sólo a quien te responde sino también a quien pueda leer las
preguntas y respuestas a posteriori.


En tu problema con obtener tipos a partir del nombre de la clase, además de
que tienes que utilizar el nombre completo de las clases (con la lista de
namespace que corresponda), si la clase se encuentra en otro assembly, debes
obtener una referencia a él (por ejemplo a través de
Assembly.GetCallingAssembly) y después llamar a GetType pero la versión que
es un método de Assembly.

Assembly a = Assembly.GetCallingAssembly();
System.Type t = a.GetType("Nspacegral.Clase");


En cuanto al catálogo, lo que estás intentando implementar es un patrón que
se llama "singleton", donde cualquier parte de un programa accede a una
única instancia de una clase, y por eso se convierte en un buen lugar para
compartir información.
Pero tú quieres implementar un singleton para compartir entre varios
dominios de aplicación. Esto significa Remoting.
Efectivamente, la solución es sencilla, se trata de crear con remoting un
servicio y registrarlo como Singleton.
Puedes partir de la documentación en
http://msdn.microsoft.com/library/e...frame=true .
Saludos.




Como quiero que la clase sea utilizada tanto para Web
como para Cliente-Servidor, no sé cuál sería la mejor
forma de almacenar dichos catálogos. (En el Application
seria buena no?, pero solo existe para Web).

Quizá una clase con un atributo static que tuviera todos
los catálogos sería eficiente y util ??

Es decir, tendría una clase con un atributo static de
tipo HashTable, que va a contener todos los catálogos, es
decir,
al ser estático estaría disponible para toda la
aplicación tanto web como cliente-servidor, no?.


Lo que me pregunto es si para Web sería eficiente en
cuanto a rendimiento. O si hay alguna otra opción mejor
que la que os planteo.


Muchísimas gracias.
Respuesta Responder a este mensaje
#2 Tristan
16/09/2003 - 16:48 | Informe spam
Es lógico lo que te ocurre. Ten en cuenta que puede haber clases con el
mismo nombre en una infinidad de ensamblados. Para especificar por nombre
una clase, si no está en el propio ensamblado, es necesario especificar el
nombre completo, que incluye entre otras cosas el ensamblado. Por supuesto,
para ello el ensamblado deben ser localizable (estar en el mismo directorio
o subdirectorio del principal, o bien en el GAC). Tienes mucha información
en la ayuda de GetType, pero en particular lo que quieres lo puedes hacer
así, si se cumple ese requisito:

string nombreClase = "NombreCompletoClase,NombreEnsamblado";
System.Type tipo = Type.GetType(nombreClase, true);
...

Si el ensamblado está en una ruta cualquiera, deberás utilizar
Assembly.LoadFrom(), o algo similar, para acceder al tipo.

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#3 Leonardo Diez
16/09/2003 - 16:58 | Informe spam
Hola Tristan,
Haz podido acceder al tipo incluyendo el nombre del ensamblado luego del
nombre de la clase, cuando trabajas con ensamblados que estan en la GAC. Yo
hice esto, pero no funciona:

Dim t As Type

t = Type.GetType("System.Windows.Forms.Form, System.Windows.Form.dll")



Tambien probé sin la extension .dll. Pude hacerlo usando el LoadFile y el
GetAssembly de la clase Assembly, pero no de esta forma. Además, el
ensamblado seguro que esta cargado porque estoy en una aplicación de
escritorio.


saludos,
Leonardo Diez
MCSD -
Equipo Técnico Grupo Danysoft

"Tristan" escribió en el mensaje
news:
Es lógico lo que te ocurre. Ten en cuenta que puede haber clases con el
mismo nombre en una infinidad de ensamblados. Para especificar por nombre
una clase, si no está en el propio ensamblado, es necesario especificar el
nombre completo, que incluye entre otras cosas el ensamblado. Por


supuesto,
para ello el ensamblado deben ser localizable (estar en el mismo


directorio
o subdirectorio del principal, o bien en el GAC). Tienes mucha información
en la ayuda de GetType, pero en particular lo que quieres lo puedes hacer
así, si se cumple ese requisito:

string nombreClase = "NombreCompletoClase,NombreEnsamblado";
System.Type tipo = Type.GetType(nombreClase, true);
...

Si el ensamblado está en una ruta cualquiera, deberás utilizar
Assembly.LoadFrom(), o algo similar, para acceder al tipo.

Juan Carlos Badiola
MVP - C#


Respuesta Responder a este mensaje
#4 Leonardo Diez
16/09/2003 - 17:01 | Informe spam
PD: el nombre del ensamblado es System.Windows.Forms no System.Windows.Form,
lo puse bien pero no funciona igual

"Leonardo Diez" escribió en el mensaje
news:
Hola Tristan,
Haz podido acceder al tipo incluyendo el nombre del ensamblado luego


del
nombre de la clase, cuando trabajas con ensamblados que estan en la GAC.


Yo
hice esto, pero no funciona:

Dim t As Type

t = Type.GetType("System.Windows.Forms.Form, System.Windows.Form.dll")



Tambien probé sin la extension .dll. Pude hacerlo usando el LoadFile y el
GetAssembly de la clase Assembly, pero no de esta forma. Además, el
ensamblado seguro que esta cargado porque estoy en una aplicación de
escritorio.


saludos,
Leonardo Diez
MCSD -
Equipo Técnico Grupo Danysoft

"Tristan" escribió en el mensaje
news:
> Es lógico lo que te ocurre. Ten en cuenta que puede haber clases con el
> mismo nombre en una infinidad de ensamblados. Para especificar por


nombre
> una clase, si no está en el propio ensamblado, es necesario especificar


el
> nombre completo, que incluye entre otras cosas el ensamblado. Por
supuesto,
> para ello el ensamblado deben ser localizable (estar en el mismo
directorio
> o subdirectorio del principal, o bien en el GAC). Tienes mucha


información
> en la ayuda de GetType, pero en particular lo que quieres lo puedes


hacer
> así, si se cumple ese requisito:
>
> string nombreClase = "NombreCompletoClase,NombreEnsamblado";
> System.Type tipo = Type.GetType(nombreClase, true);
> ...
>
> Si el ensamblado está en una ruta cualquiera, deberás utilizar
> Assembly.LoadFrom(), o algo similar, para acceder al tipo.
>
> Juan Carlos Badiola
> MVP - C#
>
>


Respuesta Responder a este mensaje
#5 Tristan
16/09/2003 - 17:33 | Informe spam
Si, el problema es que en realidad como decía, el nombre cualificado de la
clase incluye "entre otras cosas", el nombre del ensamblado, pero también
cosas como la versión, etc... gracias a eso, pueden convivir distintas
versiones de la misma clase (la solución al famoso dll hell).

El nombre completamente cualificado de la clase se obtiene así:

string nombreClase = typeof(Form).AssemblyQualifiedName;


Aunque para ese caso, me parece más fácil hacer uso de
Assembly.CreateInstance()

Assembly ensamblado = typeof(Button).Assembly; // Cualquier objeto conocido
del ensamblado
object obj = ensamblado.CreateInstance("System.Windows.Forms.Form");
Type tipo = obj.GetType();
tipo.GetMethod("Show").Invoke(obj, null);

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida