2009-08-14 4 views
24

Ich möchte in der Lage sein, einen Code-Level-Diff zwischen zwei Assemblys zu machen; Das Diff-Plug-In für Reflector ist das Nächste, was ich bisher gefunden habe, aber die gesamte Assembly zu vergleichen, ist ein manueller Prozess, bei dem ich in jeden Namespace/jede Klasse/Methode aufschlüsseln muss..NET Assembly Diff/Compare Tool - Was ist verfügbar?

Die anderen Tools, die ich bisher gefunden habe, scheinen auf Unterschiede auf der API-Ebene (Namespaces, Klassen, Methoden) beschränkt zu sein - was es nicht für das, wonach ich suche, schneidet.

Kennt jemand solch ein Werkzeug? Meine Anforderungen (vom höchsten zum niedrigsten) sind:

  • die Lage zu analysieren/spiegeln den Code Inhalt von zwei Versionen der gleichen Anordnung und berichtet über die Unterschiede
  • Akzeptieren Sie einen Ordner oder eine Gruppe von Baugruppen als Eingang ; schnell zu vergleichen, sie (ähnlich wie WinMerge Ordner diff ist)
  • Schnell Fähigkeit zu bestimmen, ob zwei Baugruppen äquivalent sind auf Codeebene (nicht nur die APIs)
  • einfache Drill-down Lassen Sie die Unterschiede
  • Exportieren Berichte anzeigen in Bezug auf die Unterschiede

(ich persönlich mag WinMerge für Text diffs, so dass eine Anwendung mit einer ähnlichen Schnittstelle wäre toll)

Antwort

13

Das Tool NDepend bietet viele Funktionen zur Behandlung von .NET-Code-Diff.

Das Panel Suche ändern widmet Baugruppen Code diff durchsuchen:

enter image description here


Viele Coderegeln, die diff und Evolution Zwang vorgeschlagen werden. Sie können ein guter Anfang sein, um eigene zu schreiben oder sie an Ihre Bedürfnisse anzupassen.schauen zum Beispiel in der Regel:

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 } 

oder auch:


Um mit NDepend Fähigkeiten vergleichen zu beginnen, haben einen Blick auf die Dokumentation:

Haftungsausschluss: Ich arbeite für NDepend

4

Versuchen sie diese:

+0

Danke für die Vorschläge; NDepend steht für nächstes Jahr auf unserer "to-buy" -Liste, aber die Compare-Tools sind in den Tests nicht verfügbar. Weißt du, ob es Differenzen auf Code-Ebene gibt? Framework Design Studio ist API-Level, und ich habe libcheck, aber habe es nicht wirklich getestet - also werde ich es jetzt versuchen :) – STW

+0

Ich habe mit NDepend vor einiger Zeit herumgemacht, aber nie in es ist zu tief. Ich war beeindruckt, aber ich weiß nichts über den Code-Level-Vergleich. –

1

Ich glaube, es ein Reflector Add-on für das bei http://www.codeplex.com/reflectoraddins genannt diff ist. Du kannst es versuchen.

+0

Ich habe es, und es macht genau das, was ich will - aber ist nur gut für den Vergleich einer einzigen Methode zu einer Zeit. Ich erwähnte diese Fallstricke in Zeile 1 meiner Frage :) – STW

0

Der diff Addin für Reflektor ist groß! Ich benutze es seit Jahren.

+0

Ich mag es auch für einzelne Vergleiche, aber es skaliert nicht, wenn Sie einen Diff-Bericht für eine vollständige Montage mit mehreren hundert Methoden benötigen, oder für mehrere hundert Baugruppen mit einem insgesamt Tausende von Methoden :-D – STW

5

Sie können ILDasm verwenden, um eine Quelle aus einer Baugruppe zu generieren. IL-Quelle ist im Grunde eine Textdatei, so dass Sie zwei il-Dateien mit Standard-Text-Diff-Tools vergleichen können. Das Interpretieren der IL-Quellen ist möglicherweise nicht notwendig, wenn Sie die gemeldeten Diffs als Anhaltspunkt dafür verwenden, wo Sie weiter nachsehen können.

0

Ich habe ein kleines Werkzeug speziell für den Vergleich von Baugruppen in einer bestimmten Art und Weise gemacht. Ich hatte zwei Assemblys, die im Prinzip die gleichen waren, außer dass die IL in den Methoden etwas anders war und man einige NOPs überall verteilt hatte. Der C# -Code war für sie fast identisch, aber die IL war deutlich anders. Ich habe versucht, ILDasm zu verwenden und die generierte Ausgabe mit TortoiseMerge/WinDiff zu vergleichen, aber es hatte so viele falsche Unterschiede, dass es nutzlos war. Die NOPs verwirrten wirklich die Ausgabe, da sie Verzweigungsadressen und dergleichen änderten und im Grunde eine Differenz in jeder Zeile jeder Methode erzeugten.

Also habe ich ein kleines Werkzeug namens ILDump gebaut. Es ist BSD lizenziert. Es ist in der Lage, NOPs zu trimmen, indem es "intelligente" Label-Umbenennungen verwendet, so dass der gleiche Code, aber um einen NOP verschoben, nicht als Unterschied von Diff-Programmen erkannt wird und auch nur signifikante Labels gedruckt werden (dh diejenigen, auf die verzweigt/umgeschaltet wird). Es kann auch Methoden sortieren, so dass zwei Assemblys, die auf andere Weise erstellt wurden, nicht als Unterschied erkannt werden.

Es ist auf jeden Fall nicht perfekt, es geht nicht um etwas anderes, als die IL jeder Methode auszugeben, und es gibt keine Hoffnung auf einen Rundum-Trip.Der Grund, warum ich es erstellt habe, war, das Lesen der IL einer Methode zu vereinfachen (es ist eine intelligente Beschriftung, die das Verfolgen von Zweigen wesentlich erleichtert) und ich könnte es durch ein Programm wie TortoiseMerge oder WinDiff laufen lassen und nicht sagen, dass es einen Unterschied gibt Codezeile.

4

ILSpy kann eine Assmblyausgabe in eine ordentliche Verzeichnisstruktur dekompilieren. Tun Sie dies für jede Ihrer Assemblies und Sie können ein Diff-Tool Ihrer Wahl verwenden, um zu sehen, was sich geändert hat.

+2

Die Verwendung dieser Technik mit einem Verzeichnis-Baum-Differenzierungs-Tool wie WinMerge oder Araxis Merge hat sich als sehr nützlich gezeigt – Cameron

4

Dies ist eine Art doppelte Frage, this one.

Wie in der anderen erwähnt, gibt es ein kostenloses & Open-Source-Tool namens BitDiffer. Es ist erstaunlich, es kann ganze Builds oder einzelne DLLs vergleichen und es zeigt die Namespace-Hierarchie, um einfach zu finden, was sich geändert hat.

+0

Sehr gutes Werkzeug. Ich kann nicht glauben, dass es bisher keine nützlichen Klicks hatte – andreas