2012-01-14 7 views
5

Tengo un requisito de cargar ensamblaje de versión diferente (ya tengo el ensamblado con el mismo nombre en mi aplicación).Usar objeto de clase en diferentes versiones del mismo ensamblado usando Reflection

Pude cargar el ensamblaje y cargar el método que necesito invocar utilizando la reflexión, pero cuando invoco el método pasando el objeto de clase como argumento, tengo la excepción de que el objeto de clase no se puede convertir al tipo del parámetro argumento

Código de ejemplo -

Assembly myAssembly = Assembly.LoadFrom("Assembly Path for assembly with different version"); 
object classObject = myAssembly.CreateInstance("ClassName"); 
Type classType = myAssembly.GetType("ClassName"); 
MethodInfo myMethod = classType.GetMethod("MyMethod", BindingFlags.Instance); 

// Creating an object of class in the latest assembly and need to pass this 
// to method in assembly with different version. 
ClassInBothVesions parameter = new ClassInBothVesions(); 

myMethod.Invoke(classObject, new object[] { parameter }); 

Aquí parámetro es un objeto de una clase que tiene en conjunto pero desde clase de parámetros, se crea en el montaje de la versión actual. Y cuando intento pasarlo al método de ensamblaje anterior, recibí una excepción que no se puede convertir.

¿Cómo puedo lograrlo? Avíseme en caso de que necesite agregar más información aquí. Gracias por adelantado.

+0

Puedo estar equivocado, pero por lo que tengo entendido, cargar una versión diferente de un ensamblaje requiere otro dominio de la aplicación. De lo contrario, se usará la versión ya cargada. – Vlad

+0

No, pude cargar el ensamblado dentro del mismo dominio de la aplicación. El único problema surge cuando intento pasar el parámetro creado en una versión a otra. Si trato de invocar el método con el objeto creado en la misma versión usando reflexión, funciona bien. –

+0

posible duplicado de [Pasar objetos de clase en diferentes versiones de ensamblaje] (http://stackoverflow.com/questions/8871079/passing-class -objects-across-different-assembly-versions) –

Respuesta

2

Debe consultar el Marco de Extensibilidad Administrado (MEF). Hace que hacer lo que desea hacer sea mucho más sencillo y lo abstrae de tener que preocuparse por los AppDomains y los diferentes ensamblajes.

Editar:

Si desea utilizar la reflexión sólo para lograr lo que quiere, se va a requerir un modelo de objetos flexible en su aplicación. Lo básico de este enfoque es lo que hace el MEF debajo del capó. Donde realmente obtienes el poder de hacerlo es desde .Net remoto, así que te sugiero que leas sobre eso.

Lo que necesitará:

  • Su aplicación en (conjunto A).

  • Montaje con código de clase anterior (conjunto C).

  • Una clase de cargador remoto que actuará como su proxy/control remoto para el segundo dominio de aplicación.

  • Una clase de proxy que representará una instancia de la versión anterior de una clase.

  • Conjunto B que contendrá su clase de proxy y su cargador remoto.

Esto es lo que podría intentar: aplicación

  1. de carga del conjunto A.

  2. Crear nueva instancia dominio de aplicación.

  3. se crea una instancia de la clase "Cargador remoto" en el nuevo dominio de aplicación del conjunto B.

    a. Esto provocará que el ensamblaje B se cargue en AppDomain.

  4. Desde su "Remote Loader", cargue el ensamblado C y cree una instancia de su clase anterior y luego regrese una instancia de la clase proxy al AppDomain original.

  5. Espero que pueda modificar sus métodos para aceptar una versión más genérica del objeto (¿posiblemente una interfaz?) Que el proxy y su nueva versión de clase pueden implementar.

+0

+1 .. Gracias, analizaremos esto ... pero no puedo integrarlo con mi aplicación en este momento. ¿Hay alguna salida usando la reflexión ... ?? –

+0

Lo he actualizado con un método de reflexión solamente, aunque sugeriría que realmente reconsidere lo que está tratando de lograr ya que es más o menos un truco demasiado complicado. – doogle

Cuestiones relacionadas