Pregunta

En nuestro software de procesamiento, estamos pasando de una versión de un ensamblaje externo a una versión más nueva. Si bien la tarea general que realiza el ensamblaje es la misma, la API es radicalmente diferente y no se ha mantenido la compatibilidad con versiones anteriores. La API es responsable de extraer datos de estaciones externas que pueden estar ejecutándose con una API nueva o antigua coincidente (tampoco compatibilidad con versiones anteriores). No tenemos control del software en el ensamblaje externo o en las estaciones externas. El ensamblaje externo no está fuertemente firmado y el módulo en el ensamblaje tiene el mismo nombre para ambas versiones.

En lugar de mantener dos versiones de nuestro software de procesamiento, nos gustaría evolucionarlo dinámicamente y hacer que use la versión anterior o la nueva versión del ensamblaje externo dependiendo de la estación externa a la que contactar. Podemos determinar si una estación externa admite la nueva versión, por lo que la opción de "versión" puede ser más o menos explícito.

Entonces, la configuración es que tenemos un ensamblado externo ComLib.dll en dos versiones. ¿Podemos hacer referencia a las dos versiones del mismo ensamblaje / proyecto y cómo podemos distinguir entre los dos ensamblajes al determinar los tipos, etc.?

Suponiendo que lo anterior no se puede hacer desde un solo ensamblaje / proyecto, podríamos implementar un adaptador de versión específico. ensamblajes, uno para cada versión del ensamblaje externo (creo que ya tenemos suficientes interfaces y abstracciones para esto) pero hay advertencias que debemos tener en cuenta o algunas configuraciones específicas para evitar la confusión de tipo / versión en tiempo de ejecución (resolución de ensamblaje / cargando etc.)? ¿Hay suficientes "uno al lado del otro"? ¿Soporte en el tiempo de ejecución de .NET para esta configuración?

ACTUALIZACIÓN: Se agrega un giro adicional a esta pregunta solo para hacer las cosas más interesantes. Parece que el ensamblaje externo carga ensamblajes adicionales y usa archivos de configuración externos. Dado que las diferentes versiones necesitan diferentes archivos de configuración y diferentes conjuntos adicionales, cada versión necesita cargar de alguna manera los conjuntos adicionales que coinciden con su versión también.

Me parece que lo que queremos es que los ensamblajes de cada versión se carguen con una "raíz". en una carpeta separada que contiene su archivo de configuración y ensamblajes adicionales. ¿Es esto posible incluso con el solucionador / cargador de ensamblaje estándar o tendríamos que hacer algo de magia y tal vez cargar ensamblajes manualmente (en dominios de aplicación separados?) Para aplicar " root " carpetas?

¿Fue útil?

Solución

Una buena publicación sobre las opciones para esto se puede encontrar aquí: http: // kevin-berridge. blogspot.com/2008/01/two-versions-of-same-shared-assembly.html

Otros consejos

Usted dice que este código se usa para comunicarse con estaciones externas. ¿Por qué no hacer un servicio con el código que se comunica con las estaciones externas? Ese servicio se llamaría desde su programa actual.

Esto le permitiría tener dos versiones del servicio en ejecución: una para la API anterior y otra para la nueva. Cada servicio estaría en su propio proceso (o tal vez AppDomain), por lo que podría cargar las versiones de los ensamblados que le gusten. En el proceso de que su programa principal cambie de una estación a otra, cambiaría de un servicio a otro a medida que cambia la versión de la API.

Esto tendría el beneficio adicional de aislarlo de su proveedor externo creando una tercera versión de la API que no es compatible con las dos primeras.

El rendimiento de esta solución podría ser bastante alto, ya que su programa principal podría comunicarse con los servicios a través de canalizaciones con nombre, o incluso un transporte en memoria. WCF puede cambiar entre transportes (enlaces), en la mayoría de los casos sin cambios en su código.

Puede firmar los ensamblajes usted mismo usando ILMerge y luego use esta técnica para hacer referencia a ellos desde el mismo proyecto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top