Pregunta

Permítame dar un escenario y luego ver si alguien tiene una solución / solución alternativa.

Tengo una biblioteca (DLL) que contiene solo clases. En otra biblioteca, tengo interfaces que implementan las clases de la primera biblioteca. Los clientes siempre harán referencia a una sola versión de la biblioteca que contiene las interfaces (siempre la más reciente), y solo se harán adiciones a esas interfaces (más interfaces / métodos). Además, solo habrá una versión de esa biblioteca de interfaces, de modo que los clientes no necesitan actualizar las referencias (la biblioteca de interfaces se cargará a través de la reflexión), por lo que las reglas de sondeo habituales no se aplican, solo podemos cargar lo que el cliente específicamente pregunta por). La biblioteca que implementa las interfaces tendrá varias versiones a las que los diferentes clientes hacen referencia al mismo tiempo.

El problema se produce cuando un ensamblaje de cliente hace referencia a una versión anterior de la biblioteca de implementación. Crea un objeto a partir de un tipo de clase en la biblioteca de implementación y luego lo pasa a otro conjunto de cliente. Ese ensamblaje de cliente utiliza la última versión (y única) de la biblioteca de interfaces e intenta convertir el objeto que se le pasa con el tipo de interfaz adecuado. Este lanzamiento falla con la excepción 'System.TypeLoadException: El método X en el tipo Y del ensamblaje Z no tiene una implementación'. Esperaba esta excepción porque en la nueva versión de la interfaz (el mismo número de versión - la biblioteca de clobbered anterior), el método X está definido, pero aunque la versión anterior del objeto que se pasa contiene metadatos que dicen que implementa la interfaz correspondiente, el la asignación falla en el nuevo método de interfaz X porque no tiene ninguna implementación en esa clase.

Entonces, mi pregunta es esta; ¿Hay alguna forma de que un cliente use esa interfaz, pero solo causa una excepción cuando se llama a un método que no se implementa en el objeto al que se hace referencia (en lugar de que se genere la excepción cuando el objeto al que se hace referencia se convierte en el tipo de interfaz más nuevo)?

Por cierto, el enlace tardío no es una opción porque queremos una comprobación de tipo de tiempo de inteligencia / compilación ... Además, sé cómo hacer esto con punteros de función y clases de envoltura. Esperaba una solución mejor que está más en sintonía con los tipos regulares de .NET.

Gracias: cualquier ayuda es muy apreciada

¿Fue útil?

Solución

Podría usar una Clase abstracta (MustInherit) en lugar de una Interfaz en la biblioteca que contiene las interfaces y establecer los métodos y propiedades como Anulables. De esta manera, incluso si los métodos solo lanzaran una excepción no implementada, siempre habría una implementación para cada método en la biblioteca de interfaz. Al hacer que los métodos sean Anulables en lugar de MustOverride, se debe evitar la excepción TypeLoadException.

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