2010-09-02 17 views
13

Estoy tratando de depurar un código que utiliza la reflexión para cargar pluginsDos tipos no es igual que debe ser

Aquí está el código de depuración:

Type a = methodInfo.GetParameters()[0] 
    .ParameterType.BaseType; 
Type b = typeof(MessageContext); 
Debug.WriteLine(a.AssemblyQualifiedName); 
Debug.WriteLine(b.AssemblyQualifiedName); 
Debug.WriteLine(a.Equals(b)); 

Y aquí es su salida:

OrtzIRC.Common.MessageContext, OrtzIRC.Common, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null
OrtzIRC.Common.MessageContext, OrtzIRC.Common, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = Null
Falso

No entiendo lo que haría que estos dos tipos diferentes?

+0

¿Qué devuelve '.UnderlyingSystemType' en ambos? –

+0

@Noon Lo mismo. –

+1

Bueno, entonces. ¿Fueron cargados por cargadores de diferentes clases? –

Respuesta

17

La misma clase/tipo cargado por diferentes dominios de aplicaciones .NET [] o [cargadores de clases Java] no comparará iguales y no son asignables a/desde uno al otro directamente.

Es probable que tenga dos copias de la DLL que contiene ese tipo, una cargada por el programa principal y otra cargada por uno de los métodos Assembly.Load*(...)?

intentar que aparezca/comparación de las propiedades:
a.Assembly.Equals(b.Assembly)
y
a.Assembly.Location.Equals(b.Assembly.Location)

En general, sólo desea una copia de cada archivo DLL y lo han cargado en un único dominio de aplicación.

+2

Tiene razón, estaba cargando dos copias del mismo ensamblaje. Uno de ellos estaba siendo copiado al directorio de complementos, así que supongo que el plugin lo estaba cargando en lugar del que ya estaba en el dominio de la aplicación. Así que simplemente eliminé el ensamblaje y apagué "Copiar local" y funcionó. ¡Gracias! –

+0

¡Gran explicación! : D –

+0

Tengo un problema similar (si no es el mismo).Noté que a pesar de estar en diferentes dominios de aplicación, las funciones 'Assembly.Load *' tienen éxito al verificar la igualdad de tipos pero fallan las funciones 'Assembly.ReflectionOnlyLoad *'. Agradecería que pudieras consultar mi pregunta: http://stackoverflow.com/q/40292593/975724 –

0

Así es como se debe comparar los tipos:

C# Object Type Comparison

Creo que su problema reside en la jerarquía de tipos ...

3

Esto puede suceder si los dos tipos se cargan desde diferentes versiones de la asamblea. .NET los considera tipos diferentes y no relacionados. Compruebe

Debug.WriteLine (a.AssemblyQualifiedName) ; 
Debug.WriteLine (b.AssemblyQualifiedName) ; 
+0

Ambos son idénticos, la misma versión. –

+1

Entonces, probablemente sea el contexto del cargador de ensamblaje: el ensamblaje 'typeof()' se carga en el contexto predeterminado, pero 'Assembly.LoadFrom()' y sus amigos se cargan en el contexto LoadFrom. Nuevamente obtienes diferentes tipos. La solución consiste en comprobar si el ensamblado ya está cargado en el dominio de aplicación antes de 'LoadFrom()''ing it. –

+0

* o * asegúrese de cargar OrtzIRC.Common en el contexto predeterminado ('typeof (MessageContext)' debería hacerlo) antes de comenzar a cargar los complementos que hacen referencia a este ensamblaje. –

0

Probar: Debug.Writeline(a.Equals(b));

+0

Todavía devuelve falso. –

Cuestiones relacionadas