2009-08-14 22 views
24

मैं दो असेंबली के बीच कोड-स्तर अंतर करने में सक्षम होना चाहता हूं; रिफ्लेक्टर के लिए डिफ प्लग-इन अब तक की सबसे नज़दीकी चीज है, लेकिन पूरी असेंबली की तुलना करने के लिए एक मैन्युअल प्रक्रिया है जो मुझे प्रत्येक नेमस्पेस/कक्षा/विधि में ड्रिल-डाउन करने की आवश्यकता होती है।.NET असेंबली डिफ/तुलना टूल - क्या उपलब्ध है?

अन्य उपकरण जिन्हें मैंने अभी तक पाया है, वे एपीआई-स्तर (नामस्थान, कक्षाएं, विधियों) मतभेदों तक ही सीमित हैं - जो मैं ढूंढ रहा हूं उसके लिए इसे काट नहीं दूंगा।

क्या कोई इस तरह के उपकरण के बारे में जानता है? (उच्चतम से न्यूनतम) मेरी आवश्यकताएँ हैं:

  • का विश्लेषण करने में सक्षम हो/एक ही विधानसभा के दो संस्करणों की कोड सामग्री को दर्शाने और मतभेदों
  • एक फ़ोल्डर या इनपुट के रूप में विधानसभाओं के समूह स्वीकार की रिपोर्ट ; जल्दी से निर्धारित करने के लिए अगर दो विधानसभाओं कोड के स्तर पर बराबर हैं उन्हें
  • त्वरित क्षमता (WinMerge के फ़ोल्डर diff के समान) की तुलना (न केवल एपीआई)
  • अनुमति दें आसान ड्रिल-डाउन मतभेद
  • रिपोर्ट के निर्यात को देखने के लिए मतभेद

(व्यक्तिगत तौर पर मैं पाठ डिफ के लिए WinMerge चाहते हैं, तो एक समान अंतरफलक के साथ एक आवेदन पत्र बहुत अच्छा होगा)

उत्तर

13

उपकरण NDepend .NET कोड diff को संभालने के लिए कई सुविधाएं प्रदान करता है।

बदलें द्वारा पैनल खोजें विधानसभाओं कोड diff ब्राउज़ करने के लिए समर्पित है:

enter image description here


कई कोड नियम है कि diff में रोके और विकास प्रस्तावित हैं। वे स्वयं को लिखने या अपनी आवश्यकताओं के अनुरूप अनुकूलित करने के लिए एक अच्छी शुरुआत हो सकती है।उदाहरण के लिए शासन को देखो:

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 } 

या भी:


NDepend क्षमताओं की तुलना के साथ आरंभ करने के लिए, प्रलेखन पर एक नजर है:

  • Advanced Code Diff from within Visual Studio: बताते हैं कि कैसे NDepend तुलना सुविधाओं का निर्माण का उपयोग करने, विजुअल स्टूडियो और विजुअल एनडॉन्ड स्टैंडअलोन यूआई के संदर्भ में

  • Reporting Code Diff: कैसे NDepend रिपोर्टिंग के संदर्भ में, तुलना सुविधाओं का निर्माण उपयोग कैसे करें।

अस्वीकरण: मैं NDepend

4

के बारे में इन का प्रयास करें:

+0

सुझावों के लिए धन्यवाद; अगले वर्ष के लिए एनडीपेन्डर हमारी 'टू-बाय' सूची पर है, लेकिन उनके तुलना टूल परीक्षणों में उपलब्ध नहीं हैं। क्या आप जानते हैं कि यह कोड-स्तरीय अंतर करता है या नहीं? फ्रेमवर्क डिज़ाइन स्टूडियो एपीआई-स्तर है, और मुझे libcheck मिल गया है लेकिन वास्तव में इसका परीक्षण नहीं किया है - इसलिए मैं इसे अभी एक शॉट दूंगा :) – STW

+0

मैंने थोड़ी देर पहले एनडेंड के साथ गड़बड़ी की, लेकिन कभी नहीं मिला यह बहुत गहरा है। मैं इसके साथ प्रभावित था, लेकिन मुझे डर लगता है कि कोड-स्तर diff के बारे में मुझे नहीं पता। –

1

मेरा मानना ​​है कि http://www.codeplex.com/reflectoraddins बुलाया diff पर उस के लिए एक परावर्तक ऐड-ऑन है। आप कोशिश कर सकते हैं

+0

मुझे यह मिल गया है, और यह वही करता है जो मैं चाहता हूं - लेकिन एक समय में एक ही विधि की तुलना करने के लिए केवल अच्छा है। मैंने अपने प्रश्न के लाइन 1 में इस पतन का उल्लेख किया :) – STW

0

के लिए काम परावर्तक के लिए diff ऐड महान है! मैं इसे वर्षों से उपयोग कर रहा हूं।

+0

मुझे व्यक्तिगत तुलना के लिए भी यह पसंद है, लेकिन जब आप कई सौ विधियों के साथ एक पूर्ण असेंबली के लिए एक diff रिपोर्ट की आवश्यकता होती है, या कई सौ असेंबली के साथ यह स्केल नहीं करता है हजारों विधियों :- डी – STW

5

आप असेंबली से आईएल स्रोत उत्पन्न करने के लिए ILDasm का उपयोग कर सकते हैं। आईएल स्रोत मूल रूप से एक टेक्स्ट फ़ाइल है, इसलिए आप मानक टेक्स्ट diff उपकरण का उपयोग कर दो आईएल फाइलों की तुलना कर सकते हैं। आईएल स्रोतों की व्याख्या करना आवश्यक नहीं है, अगर आप रिपोर्ट किए गए diffs का उपयोग संकेत के रूप में करते हैं जहां आगे देखना है।

0

मैंने विशेष रूप से असेंबली की तुलना करने के लिए एक छोटा सा टूल बनाया है। मेरे पास दो असेंबली थीं जो आईएल को छोड़कर मूल रूप से समान थीं, तरीकों में थोड़ा अलग था और एक में कुछ एनओपी फैल गए थे। सी # कोड उनके लिए लगभग समान था, लेकिन आईएल स्पष्ट रूप से काफी अलग था। मैंने ILDasm का उपयोग करने और टोर्टोइस मेर्ज/विनडिफ के साथ जेनरेट आउटपुट की तुलना करने की कोशिश की, लेकिन इसमें इतने सारे झूठे मतभेद थे कि यह बेकार था। एनओपी वास्तव में आउटपुट के साथ गड़बड़ कर चुके थे क्योंकि इससे शाखा के पते बदल गए और इस तरह और मूल रूप से प्रत्येक विधि की प्रत्येक पंक्ति पर एक अंतर उत्पन्न किया।

तो, मैंने ILDump नामक एक छोटा सा टूल बनाया। यह बीएसडी लाइसेंस प्राप्त है। यह "स्मार्ट" लेबल नामकरण का उपयोग करके एनओपी को ट्रिम करने में सक्षम है, ताकि कोड एक जैसा हो, लेकिन एनओपी द्वारा स्थानांतरित किया गया हो, तो इसे डिफ प्रोग्राम द्वारा अंतर के रूप में नहीं पहचाना जाएगा, और यह केवल महत्वपूर्ण लेबल प्रिंट करता है (यानी, जिन्हें ब्रांच/स्विच किया जाता है)। यह विधियों को भी सॉर्ट कर सकता है ताकि एक अलग तरीके से "बनाई गई" दो विधानसभाएं एक अंतर के रूप में नहीं पकड़ी जाएंगी।

यह निश्चित रूप से सही नहीं है, यह किसी भी चीज़ को संभाल नहीं करता है लेकिन प्रत्येक विधि के आईएल को डंप करता है, और गोल ट्रिपिंग की कोई उम्मीद नहीं है।जिस कारण से मैंने इसे बनाया था, वह एक विधि के आईएल को आसान बनाना था (यह स्मार्ट लेबलिंग शाखाओं को ट्रैक करना काफी आसान बनाता है), और इसलिए कि मैं इसे टोर्टोइजमेज या विनडिफ जैसे प्रोग्राम के माध्यम से चला सकता हूं और यह नहीं कहता कि प्रत्येक पर कोई अंतर है कोड की रेखा।

4

ILSpy एक साफ निर्देशिका संरचना में एक assmembly बाहर decompile कर सकते हैं। अपनी प्रत्येक असेंबली के लिए ऐसा करें और आप क्या बदल गए हैं यह देखने के लिए अपनी पसंद के एक diff टूल का उपयोग कर सकते हैं।

+2

इस तकनीक का उपयोग निर्देशिका-वृक्ष differencing उपकरण जैसे WinMerge या Araxis Merge के साथ बहुत उपयोगी – Cameron

4

यह एक डुप्लिकेट प्रश्न है, this one पर।

जैसा कि दूसरे में बताया गया है, वहां ओपन सोर्स टूल है जिसे BitDiffer कहा जाता है। यह आश्चर्यजनक है, यह पूरे बिल्ड या एकल डीएलएल की तुलना कर सकता है और यह आसानी से खोजने के लिए नामस्थान पदानुक्रम दिखाता है।

+0

बहुत उपयोगी उपकरण साबित हुआ है। विश्वास नहीं कर सकता कि अब तक कोई उपयोगी क्लिक नहीं है – andreas

संबंधित मुद्दे