2011-02-22 12 views
22

Estoy trabajando en un ensamblado C# 3.5 que es consumido por muchas aplicaciones diferentes en un entorno de servidor empresarial. Me gustaría agregar algunas propiedades a una clase C# existente (no abstracta) y mantener la compatibilidad con clientes actuales sin recompilar. Es un ensamble de nombre fuerte 3.5. Las aplicaciones cliente existentes no se volverán a compilar. En su lugar, utilizamos ensamblajes de políticas de editores para redirigir los clientes existentes a la versión actualizada.Reglas para la compatibilidad con la clase C#/evitar cambios de rotura

¿Cuáles son las reglas para mantener este tipo de compatibilidad con las versiones anteriores?

Estoy buscando un conjunto de reglas con las que pueda validar mis cambios de código.

Después de mis intentos actuales de actualizar la clase, los clientes lanzan una excepción "La definición del manifiesto del conjunto localizado no coincide con la referencia de ensamblaje".

+3

Ver [Una guía definitiva sobre los cambios de la API en .NET] (http://stackoverflow.com/questions/1456785/a-definite-guide-to-api-breaking-changes-in-net) – Justin

+0

@ Kragen - ¡Gracias! La mejor referencia que he visto hasta ahora. Si haces una respuesta a tu comentario, lo aceptaré. – ErnieL

Respuesta

2

Debe mantener la misma versión de ensamblaje (es decir, no aumentarla en las compilaciones) - consulte AssemblyVersionAttribute in MSDN.

Además, podría aprovechar las redirecciones de enlace de ensamblaje, pero esto implica cambios en el archivo de configuración que no espero sean deseables en su caso.

+0

Tenemos ensamblados de políticas de editores que manejan los cambios en el número de versión: http://msdn.microsoft.com/en-us/library/7wd6ex19.aspx. Ese no es el problema. – ErnieL

2

En este punto, el error que está obteniendo no está relacionado con la compatibilidad entre clases, sino más bien con un problema al cargar el ensamblado; consulte The located assembly's manifest definition does not match the assembly reference si ayuda.

Agregar propiedades/métodos para exisitng class debería estar bien para compatibilidad con versiones anteriores. Eliminar campos/métodos/propiedades, cambiar de clase a estructura, cambiar la clase base definitivamente no lo es. La modificación de constantes, valores enum es peligroso.

+0

Lo que dices se alinea con mi comprensión. Sin embargo, todavía logré romper algo ... ¿Sabes dónde está oficialmente documentado? Mis intentos de búsqueda en Google y MSDN han fallado. – ErnieL

+0

No sé si hay una buena descripción en MSDN. Recomiendo leer el libro "Pautas de diseño del marco" si tiene tiempo, ya que cubre todo tipo de problemas con el diseño de las jerarquías de clases. También puede leer blogs como http://blogs.msdn.com/b/bclteam/archive/2004/09/07/226489.aspx y http://blogs.msdn.com/b/kcwalina/archive/tags/ design + guidelines/default.aspx –

+1

Cambiar un campo a una propiedad es NO-NO-NO (claramente lo contrario, la propiedad del campo es NO-NO-NO). Agregar una interfaz IDisposable es un cambio radical del punto de vista del usuario, pero probablemente no interrumpirá directamente el funcionamiento de la cosa (simplemente los recursos no se liberarán oportunamente) – xanatos

Cuestiones relacionadas