2011-11-26 15 views
6

Ho un assembly che fornisce un'API e viene utilizzato da alcuni altri assembly. Devo verificare che una versione più recente di DLL dll sia ancora compatibile con gli assembly precedenti che utilizzavano la versione precedente dell'API.Come posso verificare la compatibilità all'indietro dell'API tra .net assembly

ho trovato un paio di domande che chiedono la stessa cosa, ma non ci sono risposte che risolvono il mio problema:

strumenti suggeriti può confrontare solo due assemblee e dire se ci sono possibili rotture delle modifiche in API, ma non se la più recente API rompe davvero il vecchio assembly che lo utilizza. Mi piacerebbe trovare uno strumento o scrivere un test che sarà in grado di verificare se ognuna delle vecchie DLL può funzionare con la mia nuova DLL API.

Per quanto riguarda le modifiche apportate all'API, è più probabile che lo estenderò solo, ma anche se è ancora possibile interrompere il codice negli assiemi più vecchi. Alcuni degli esempi di tali cambiamenti può essere trovato qui:

Per ora l'unica soluzione che vedo è quello di compilare il codice sorgente delle assemblee più anziani con la più nuova API , ma mi piacerebbe farlo solo con gli assembly e aggiungerli come parte dei miei test unitari. C'è un modo migliore di gestirlo?

modifica:

sto cercando uno strumento che sarà in grado di automatizzare il processo di verifica della compatibilità tra NET. (riga di comando o anche con qualche api)

+1

Probabilmente è la mia mancanza di comprensione, ma non capisco che lo strumento che stai cercando potrebbe fare meglio o più facilmente che semplicemente compilando le fonti combinate. Voglio dire, lo strumento avrebbe bisogno sia della vecchia che della nuova sorgente per essere in grado di analizzare i cambiamenti di rottura nel modo in cui intendevi, no? Forse puoi riempirmi. –

+0

@GertArnold Ho aggiornato la mia domanda, vorrei automatizzare questo processo, quindi potrebbe non essere molto conveniente compilare manualmente il codice sorgente o eseguire uno strumento manualmente – username

risposta

9

Quello che vuoi è fare un diff e generare un elenco di modifiche di rottura. Quindi si desidera cercare se i propri assiemi utilizzano una delle API danneggiate. Puoi farlo con lo strumento ApiChange per fare il diff e trovare gli utenti interessati.

Per renderlo più concreto. Se è stato rimosso un metodo da un'interfaccia, è necessario trovare tutti gli implementatori e gli utenti di questo metodo in classi che utilizzano il metodo di interfaccia o qualsiasi classe che implementa questo metodo.

ApiChange può cercare implementatori e utenti di metodi specifici sulla riga di comando con i comandi -whoimplementsinterface e -whousesmethod. Non è automatizzato sulla riga di comando ma è possibile utilizzare direttamente ApiChange.Api.dll per automatizzare queste query.

Edit1:

ho solo dimenticato: lo strumento ApiChange ha in realtà il functionality siete interessati già. E 'l'opzione

-ShowrebuildTargets -nuovo -vecchio [-old2] -searchin

abbiamo usato nel nostro reparto con buoni risultati. L'unico risultato sono i file Intellisense XML.Se un altro target non usa il metodo rimosso ma lo fa riferimento all'interno di XmlDoc, il compilatore scriverà un avvertimento indicando che un metodo non esistente è stato referenziato. Questo è piuttosto difficile da catturare e comporterebbe l'analisi dei file docu intellisense. Ma questo è piuttosto un caso limite.

+0

Questo approccio funzionerà se aggiungerà un nuovo sovraccarico che può causare ambiguità nelle chiamate di metodo negli assembly che utilizzano la mia API? – username

+0

Un'abnegazione del compilatore non si romperà. Presumo che tu voglia trovare i cambiamenti di rottura che richiederanno una ricompilazione. Può accadere che durante una ricompilazione venga usato un altro metodo rispetto a prima, ma gli obiettivi già costruiti dovrebbero essere in grado di lavorare con i metodi a cui sono già collegati. Se si desidera aggiungere anche questo tipo di supporto, è necessario implementare parti della specifica ECMA C# per gestire gli overload dei metodi e il modo in cui il compilatore C# li risolve. –

+0

Grazie, ho appena testato il caso che ho descritto nel mio primo commento e funziona bene – username

Problemi correlati