Aquí hay un pickle bastante desagradable que entramos en el sitio de un cliente. El cliente tiene aproximadamente 100 estaciones de trabajo, en las cuales implementamos la versión 1.0.0 de nuestro producto "MyApp".Cambio de interfaz entre versiones: ¿cómo gestionarlo?
Ahora, una de las cosas que hace el producto es cargar un complemento (llámalo "MyPlugIn", que primero busca en un servidor central para ver si hay una versión más nueva, y si es entonces copia ese archivo localmente, luego carga el complemento usando Assembly.Load
e invoca una cierta interfaz conocida. Esto ha funcionado bien durante varios meses.
Luego el cliente quería instalar v1.0.1 de nuestro producto en algunos máquinas (pero no todas). Eso vino con una versión nueva y actualizada de MyPlugIn.
Pero luego vino el problema. Hay una DLL compartida, a la que hacen referencia MyApp y MyPlugIn, llamada MyDLL, que tiene un método MyClass.MyMethod
. Entre v1.0.0 y v1.0.1, la firma de MyClass.MyMethod
cambió (se agregó un parámetro). Y ahora la nueva versión de miPlugin hace que las aplicaciones cliente v1.0.0 a chocar:
Método no encontrado: MyClass.MyMethod (System.String)
El cliente deliberadamente no quiere desplegar v1 .0.1 en todas las estaciones cliente, ya que la corrección que se incluía en v1.0.1 era necesaria solo para algunas estaciones de trabajo, y no es necesario implementarla en todos los clientes. Tristemente, no estamos (todavía) usando ClickOnce u otras utilidades de despliegue masivo, por lo que desplegar v1.0.1 será un ejercicio doloroso y de otro modo innecesario.
¿Hay alguna forma de escribir el código en MyPlugin para que funcione igual de bien, independientemente de si se trata de MyDLL v1.0.0 o v1.0.1? Quizás haya alguna manera de explorar una interfaz esperada utilizando la reflexión para ver si existe, antes de llamarla realmente.
EDIT: Debo mencionar también: tenemos algunos procedimientos de control de calidad bastante estrictos. Desde que v1.0.1 ha sido lanzado oficialmente por QA, no podemos realizar ningún cambio en MyApp o MyDLL. La única libertad de movimiento que tenemos es cambiar MyPlugin, que es un código personalizado escrito específicamente para este cliente.
¿Por qué no volver a agregar a MyDll el método esperado por la versión del complemento anterior? Internamente, este método podría llamar a la nueva versión del método pasando un valor predeterminado para el nuevo método param. – Steve
@Steve - ver mi edición - no puede hacer ningún cambio en MyDLL –
¿MyClass.MyMethod estático? –