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
 

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.

Preguntas similares