2011-11-26 20 views
6

Tengo un ensamblado que proporciona una API y que otros ensamblajes utilizan. Necesito verificar que una versión más nueva de API dll todavía sea compatible con los ensamblajes anteriores que usaban la versión anterior de API.¿Cómo puedo probar la compatibilidad con versiones anteriores de la API entre los ensamblados de .NET

he encontrado un par de preguntas que hacen la misma, pero no hay respuestas que resuelven mi problema:

herramientas sugeridas sólo se puede comparar dos ensamblados y decir si hay posibles cambios en la API, pero no si la API más nueva realmente rompe el ensamblaje anterior que la usa. Me gustaría encontrar una herramienta o escribir una prueba que pueda verificar si cada uno de los dlls más antiguos puede funcionar con mi nueva API dll.

En cuanto a los cambios en la API es más probable que solo lo extienda, pero a pesar de que todavía puede romper el código en ensamblajes anteriores. Algunos de los ejemplos de este tipo de cambios se puede encontrar aquí:

Por ahora la única solución que veo es para compilar el código fuente de los conjuntos de mayor edad con la nueva API , pero me gustaría hacerlo solo con ensamblajes y agregarlos como parte de mis pruebas unitarias. ¿Hay alguna forma mejor de que pueda manejar eso?

edición:

Estoy buscando una herramienta que será capaz de automatizar el proceso de verificación de la compatibilidad hacia atrás entre los ensamblados .NET. (línea de comandos o con alguna API también)

+1

Probablemente es mi falta de entendimiento, pero no entiendo por qué la herramienta que está buscando podría hacer mejor o más fácil que simplemente compilar las fuentes combinadas. Quiero decir, la herramienta necesitaría tanto la fuente antigua como la nueva para poder analizar los cambios de ruptura de la forma en que lo intentas, ¿no es así? Tal vez me pueda completar. –

+0

@GertArnold He actualizado mi pregunta, me gustaría automatizar este proceso, por lo que puede no ser muy conveniente compilar el código fuente manualmente o ejecutar una herramienta manualmente – username

Respuesta

9

Lo que quiere es hacer una diferencia y generar una lista de cambios de última hora. Luego desea buscar si sus ensamblajes utilizan alguna de las API rotas. Puedes hacer esto con la herramienta ApiChange para hacer el diff y encontrar a los usuarios afectados.

Para hacerlo más concreto. Si eliminó un método de una interfaz, entonces necesita encontrar todos los implementadores y usuarios de este método en las clases que usan el método de interfaz o cualquier clase que implemente este método.

ApiChange puede buscar ejecutores y usuarios de métodos específicos en la línea de comandos con los comandos -whoimplementsinterface y -whousesmethod. No está automatizado en la línea de comandos, pero puede usar directamente el ApiChange.Api.dll para automatizar estas consultas.

Edit1:

me olvidó: La herramienta ApiChange tiene en realidad el functionality le interesa ya. Es la opción

-ShowrebuildTargets -nuevo -old [-old2] -searchin

lo utilizamos en nuestro departamento con buenos resultados. Lo único que tengo son los archivos XML Intellisense.Si otro objetivo no utiliza el método eliminado pero lo hace referencia dentro del XmlDoc, el compilador escribirá una advertencia de que se hizo referencia a un método no existente. Esto es bastante difícil de detectar y también implica analizar los archivos de documentos intellisense. Pero esto es todo un caso marginal.

+0

¿Funcionará este enfoque si agregará una nueva sobrecarga que puede provocar ambigüedad en las llamadas a métodos en ensamblados que usan mi API? – username

+0

No se romperá una abilidad de compilador. Supongo que quieres encontrar los cambios de última hora que requerirán una recompilación. Puede ocurrir que durante la recompilación se use algún otro método que antes, pero los objetivos ya construidos deberían poder funcionar con los métodos con los que ya están vinculados. Si también desea agregar dicho soporte, deberá implementar partes de la especificación ECMA C# para manejar las sobrecargas de métodos y cómo el compilador C# las resuelve. –

+0

Gracias, acabo de probar el caso que describí en mi primer comentario y funciona bien – username

Cuestiones relacionadas