2009-08-14 42 views
24

Mi piacerebbe essere in grado di fare una diff di livello di codice tra due assiemi; il plug-in Diff per Reflector è la cosa più vicina che ho trovato finora, ma per confrontare l'intero assembly è un processo manuale che richiede di eseguire il drill-down in ogni namespace/classe/metodo.Strumento di confronto/confronto assemblaggio .NET - Che cosa è disponibile?

Gli altri strumenti che ho trovato finora sono limitati alle differenze a livello di API (namespace, classi, metodi) - che non lo taglieranno per quello che sto cercando.

Qualcuno sa di tale strumento? Le mie esigenze (dal più alto al più basso) sono:

  • in grado di analizzare/riflettere il codice contenuto delle due versioni dello stesso montaggio e segnalare le differenze
  • accettare una cartella o un gruppo di gruppi come input ; confrontare rapidamente (simile a quella di WinMerge diff cartella di)
  • capacità rapido per determinare se due gruppi sono equivalenti a livello di codice (non solo l'API)
  • consentire un facile drill-down per visualizzare le differenze
  • esportazione di rapporti per quanto riguarda le differenze

(personalmente mi piace WinMerge per diff di testo, in modo da un'applicazione con un'interfaccia simile sarebbe fantastico)

risposta

13

Lo strumento NDepend offre molte funzionalità per gestire il codice .NET diff.

Il pannello Ricerca per Cambiare è dedicato a navigare assemblee codice diff:

enter image description here


Molte regole di codice che vincolo diff ed evoluzione sono proposti. Possono essere un buon inizio per scrivere i tuoi o adattarli alle tue esigenze.Per esempio guardare la regola:

Types that used to be 100% covered but not anymore

// <Name>Types that used to be 100% covered but not anymore</Name> 
warnif count > 0 
from t in JustMyCode.Types where 
    t.IsPresentInBothBuilds() && 
    t.OlderVersion().PercentageCoverage == 100 && 
    t.PercentageCoverage < 100 
let culpritMethods = t.Methods.Where(m => m.PercentageCoverage < 100) 
select new {t, t.PercentageCoverage, culpritMethods } 

o anche:


per iniziare con NDepend confrontare le capacità, dare un'occhiata alla documentazione:

Disclaimer: io lavoro per NDepend

4
+0

Grazie per i suggerimenti; NDepend è sulla nostra lista 'da comprare' per il prossimo anno, ma i loro strumenti di confronto non sono disponibili nelle prove. Sai se fa diffs a livello di codice? Framework Design Studio è a livello di API e ho libcheck, ma non l'ho ancora testato, quindi adesso lo faccio subito :) – STW

+0

Ho fatto casino con NDepend qualche tempo fa, ma non sono mai riuscito a farlo troppo profondo Sono rimasto impressionato, ma non conosco il diff di livello di codice temo. –

1

Credo che ci sia un addon Riflettore per questo al http://www.codeplex.com/reflectoraddins chiamato diff. Puoi provarlo.

+0

Ce l'ho, e fa esattamente quello che voglio, ma è utile solo per confrontare un singolo metodo alla volta. Ho menzionato questa trappola nella riga 1 della mia domanda :) – STW

0

Il componente aggiuntivo diff per riflettore è grande! Lo uso da anni.

+0

Mi piace anche per i confronti individuali, ma non si scala quando hai bisogno di un rapporto diff per un assemblaggio completo con diverse centinaia di metodi, o per diverse centinaia di assiemi con un totale di migliaia di metodi :-D – STW

5

È possibile utilizzare ILDasm per generare il codice sorgente da un assieme. Il sorgente di IL è fondamentalmente un file di testo, quindi puoi confrontare due file usando strumenti di testo standard. Interpretare le fonti IL potrebbe non essere necessario, se si utilizzano le diff riportate come un'indicazione su dove guardare oltre.

0

Ho realizzato un piccolo strumento specifico per il confronto di assiemi in un determinato modo. Avevo due assemblaggi che erano praticamente gli stessi, tranne che l'IL nei metodi era leggermente diverso e uno aveva alcuni NOP sparsi dappertutto. Il codice C# era quasi identico per loro, ma l'IL era chiaramente molto diverso. Ho provato ad usare ILDasm e confrontare l'output generato con TortoiseMerge/WinDiff, ma aveva così tante false differenze che era inutile. I NOP ​​hanno veramente incasinato l'output dal momento che ha cambiato gli indirizzi di diramazione e tale e sostanzialmente ha prodotto una differenza su ogni riga di ciascun metodo.

Quindi, ho creato un piccolo strumento chiamato ILDump. È concesso in licenza BSD. È in grado di tagliare gli NOP, usando la rinomina dell'etichetta "smart" in modo che il codice sia lo stesso, ma spostato da un NOP, non verrà rilevato come differenza dai programmi Diff, e inoltre stamperà solo etichette significative (cioè, quelli che sono ramificati/passati a). Inoltre, è in grado di ordinare i metodi in modo tale che due assiemi che sono stati "creati" in modo diverso non vengano presi come differenza.

Non è assolutamente perfetto, non gestisce nulla ma scarica l'IL di ogni metodo, e non c'è speranza di fare il giro.Il motivo per cui l'ho creato è stato quello di rendere più semplice la lettura di un metodo IL (la sua etichettatura intelligente rende molto più facile tenere traccia dei rami), e in modo che potessi eseguirlo attraverso un programma come TortoiseMerge o WinDiff e non dire che c'è una differenza su ogni linea di codice.

4

ILSpy può decompilare un assembly in una struttura di directory ordinata. Fai questo per ciascuno dei tuoi assemblaggi e puoi usare uno strumento diff di tua scelta per vedere cosa è cambiato.

+2

L'utilizzo di questa tecnica con uno strumento di differenziazione ad albero delle directory come WinMerge o Araxis Merge ha dimostrato di essere molto utile – Cameron

4

Questa è una specie di domanda duplicata, a this one.

Come già menzionato nell'altro, è disponibile uno strumento open source & denominato BitDiffer. È sorprendente, può confrontare intere build o singole DLL e mostra la gerarchia dello spazio dei nomi per trovare facilmente ciò che è cambiato.

+0

Strumento molto valido. Non riesco a credere che finora non ci siano stati clic utili – andreas

Problemi correlati