Problemón atributos de clases

18/10/2007 - 19:17 por José Luis | Informe spam
Hola a todos.

Tengo 1 dll que implementa una clase de atributo así:

using System;

using System.Collections.Generic;

using System.Text;

namespace Atributos{

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]

public class Prueba: Attribute{

public Prueba(){}

}

}

Uso ese atributo en otra clase, en otra dll, de la siguiente manera

using Atributos;

namespace Clases{

[Atributos.Prueba()]

public class Ejemplo(){

}

}



Dinámicamente cargo los assemblies en mi aplicación, y obtengo los atributos
de las clases de los assemblies:



Using Atributos;

private void PruebaAtributos(Type t){

Attribute[] Atts = Attribute.GetCustomAttributes(t);

foreach (Attribute Att in Atts){

if (Att is Atributos.Prueba){

Atributos.Prueba p = (Atributos.Prueba)Att;

}

}

No entiendo por qué, pero el código no entra en el if, es decir, falla la
validación Att is Prueba... Si fuerzo al depurador para que haga el casting
de dentro del if, me salta la siguiente excepción:

"Se detectó InvalidCastException: No se puede convertir un objeto de tipo
'Atributos.Prueba' al tipo ''Atributos.Prueba'."



¿Me podéis dar alguna pista de qué está pasando? He comprobado las dll, las
he limpiado del disco (.pdb y .dll), he regenerado todos los proyectos, he
quitado las referencias y las he vuelto a añadir, pero el error sigue ahí y
no sé que hacer con él.





Gracias y un saludo

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
18/10/2007 - 19:32 | Informe spam
"José Luis" wrote in message
news:
[...]
Dinámicamente cargo los assemblies
[...]
"Se detectó InvalidCastException: No se puede convertir un objeto de tipo
'Atributos.Prueba' al tipo ''Atributos.Prueba'."



Esto típicamente pasa cuando las dos clases vienen de distinta versión
de la DLL, por ejemplo, el primer Atributos.Prueba viene de la DLL que
tenías puesta en la referencia del proyecto, y el segundo de la que has
cargado dinámicamente. Aunque hayas hecho limpieza de DLLs, en algún sitio
se te debe escapar algo. Ponles un número de versión fijo (tal como 1.0.0.0,
es decir, no dejes el 1.0.* que te genera un número distinto cada vez que
compilas), y preferiblemente ponle un strong name para obligar a que
funcione exactamente con la versión que compilaste.
Respuesta Responder a este mensaje
#2 José Luis
18/10/2007 - 22:30 | Informe spam
Probaré, gracias. Debe ser algo de eso, porque ayer el proyecto funcionó ok,
y debe haberse generado 1 nueva versión con la compilación de hoy.

Mañana veremos.

"Alberto Poblacion"
escribió en el mensaje de noticias
news:%
"José Luis" wrote in message
news:
[...]
Dinámicamente cargo los assemblies
[...]
"Se detectó InvalidCastException: No se puede convertir un objeto de tipo
'Atributos.Prueba' al tipo ''Atributos.Prueba'."



Esto típicamente pasa cuando las dos clases vienen de distinta versión
de la DLL, por ejemplo, el primer Atributos.Prueba viene de la DLL que
tenías puesta en la referencia del proyecto, y el segundo de la que has
cargado dinámicamente. Aunque hayas hecho limpieza de DLLs, en algún sitio
se te debe escapar algo. Ponles un número de versión fijo (tal como
1.0.0.0, es decir, no dejes el 1.0.* que te genera un número distinto cada
vez que compilas), y preferiblemente ponle un strong name para obligar a
que funcione exactamente con la versión que compilaste.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida