2009-08-14 3 views
24

Tôi muốn có thể thực hiện sự khác biệt mức mã giữa hai hội đồng; plug-in Diff cho Reflector là điều gần nhất tôi đã tìm thấy cho đến nay, nhưng để so sánh toàn bộ assembly là một quá trình thủ công yêu cầu tôi phải đi sâu vào mọi không gian tên/lớp/phương thức..NET Assembly Diff/Compare Tool - Có gì?

Các công cụ khác mà tôi đã tìm thấy cho đến nay dường như bị giới hạn ở cấp độ API (không gian tên, lớp, phương pháp) khác nhau - điều này sẽ không cắt giảm những gì tôi đang tìm kiếm.

Có ai biết về công cụ như vậy không? yêu cầu của tôi (từ cao nhất đến thấp nhất) là:

  • Có thể phân tích/phản ánh đang nội dung của hai phiên bản của cùng một assembly và báo cáo sự khác biệt
  • Chấp nhận một thư mục hoặc một nhóm hội như là đầu vào ; nhanh chóng so sánh chúng (tương tự như của diff thư mục WinMerge của)
  • khả năng nhanh để xác định xem hai cụm là tương đương ở cấp mã (không chỉ của API)
  • Cho phép dễ dàng khoan xuống để xem sự khác biệt
  • Xuất khẩu các báo cáo liên quan đến sự khác biệt

(Cá nhân tôi thích WinMerge cho diffs văn bản, vì vậy một ứng dụng với một giao diện tương tự sẽ là tuyệt vời)

Trả lời

13

Công cụ NDepend cung cấp nhiều tính năng để xử lý chênh lệch mã .NET.

Bảng Tìm kiếm theo Change được dành để duyệt hội đang diff:

enter image description here


Nhiều quy tắc mã mà hạn chế diff và tiến hóa được đề xuất. Họ có thể là một khởi đầu tốt để viết những cái của riêng bạn hoặc điều chỉnh chúng theo nhu cầu của bạn.Ví dụ nhìn vào quy tắc:

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 } 

hoặc thêm:


Để bắt đầu với NDepend so sánh khả năng, có một cái nhìn tại các tài liệu:

  • Advanced Code Diff from within Visual Studio: giải thích làm thế nào để sử dụng NDepend xây dựng các tính năng so sánh, trong ngữ cảnh của giao diện người dùng độc lập Visual Studio và Visual NDepend.

  • Reporting Code Diff: giải thích cách sử dụng các tính năng so sánh xây dựng NDepend, trong ngữ cảnh báo cáo.

Disclaimer: Tôi làm việc cho NDepend

4

Hãy thử những:

+0

Cảm ơn các đề xuất; NDepend nằm trong danh sách 'mua' của chúng tôi trong năm tới, nhưng công cụ So sánh của họ không có sẵn trong các thử nghiệm. Bạn có biết liệu nó có khác biệt về mã không? Framework Design Studio là API cấp, và tôi đã có libcheck nhưng chưa thực sự thử nghiệm nó - vì vậy tôi sẽ cho nó một shot ngay bây giờ :) – STW

+0

Tôi đã làm lộn xộn về NDepend một lúc trở lại, nhưng không bao giờ đi vào nó quá sâu. Tôi đã rất ấn tượng với nó, nhưng tôi không biết về sự khác biệt về mức mã mà tôi sợ. –

1

Tôi tin rằng có một addon Reflector cho rằng tại http://www.codeplex.com/reflectoraddins gọi khác. Bạn có thể thử điều đó.

+0

Tôi đã có nó, và nó thực hiện chính xác những gì tôi muốn - nhưng chỉ tốt để so sánh một phương pháp duy nhất tại một thời điểm. Tôi đã đề cập đến vấn đề này trong dòng 1 của câu hỏi của tôi :) – STW

0

Addin diff cho phản xạ là tuyệt vời! Tôi đã sử dụng nó trong nhiều năm.

+0

Tôi thích nó cũng như so sánh cá nhân, nhưng nó không mở rộng khi bạn cần một báo cáo khác cho một hội đồng đầy đủ với hàng trăm phương pháp, hoặc cho hàng trăm hội đồng với một tổng số hàng ngàn phương pháp: -D – STW

5

Bạn có thể sử dụng ILDasm để tạo nguồn il từ một hội đồng. Nguồn IL về cơ bản là một tệp văn bản, vì vậy bạn có thể so sánh hai tệp il bằng cách sử dụng các công cụ tìm kiếm văn bản chuẩn. Việc giải thích các nguồn IL có thể không cần thiết, nếu bạn sử dụng các khác biệt được báo cáo như một chỉ dẫn để xem xét thêm.

0

Tôi đã tạo một công cụ nhỏ đặc biệt để so sánh Hội đồng theo một cách nhất định. Tôi đã có hai hội đồng mà về cơ bản giống nhau ngoại trừ IL trong các phương pháp hơi khác nhau và một số NOP đã lan truyền khắp nơi. Mã C# gần giống với chúng, nhưng IL rõ ràng là khá khác nhau. Tôi đã thử sử dụng ILDasm và so sánh kết quả được tạo ra với TortoiseMerge/WinDiff, nhưng nó có quá nhiều sự khác biệt sai lệch đến nỗi nó vô dụng. NOPs thực sự gây rối với đầu ra vì nó thay đổi địa chỉ chi nhánh và như vậy và về cơ bản đã tạo ra sự khác biệt trên mỗi dòng của mỗi phương thức.

Vì vậy, tôi đã xây dựng một công cụ nhỏ có tên là ILDump. Đó là BSD được cấp phép. Nó có khả năng cắt bỏ NOP, sử dụng đổi tên nhãn "thông minh" để mã giống nhau, nhưng được dịch chuyển bởi NOP, nó sẽ không bị phát hiện là khác biệt bởi các chương trình Diff, và nó cũng chỉ in ra các nhãn quan trọng (tức là, những nhánh được phân nhánh/chuyển sang). Nó cũng có thể sắp xếp các phương thức sao cho hai hội đồng được "tạo ra" theo một cách khác sẽ không bị coi là khác biệt.

Nó chắc chắn không hoàn hảo, nó không xử lý bất kỳ thứ gì ngoài việc loại bỏ IL của từng phương thức, và không có hy vọng vấp ngã.Lý do tôi tạo ra nó là làm cho việc đọc phương thức IL dễ dàng hơn (ghi nhãn thông minh giúp việc theo dõi chi nhánh dễ dàng hơn) và để tôi có thể chạy nó thông qua một chương trình như TortoiseMerge hoặc WinDiff và nó không nói có sự khác biệt dòng mã.

4

ILSpy có thể dịch ngược một kết quả ra thành cấu trúc thư mục gọn gàng. Làm điều này cho mỗi hội đồng của bạn và bạn có thể sử dụng một công cụ khác của sự lựa chọn của bạn để xem những gì đã thay đổi.

+2

Sử dụng kỹ thuật này với công cụ phân biệt cây thư mục như WinMerge hoặc Araxis Merge đã hiển thị rất hữu ích – Cameron

4

Đây là loại câu hỏi được sao chép, đến this one.

Như đã đề cập ở phần khác, có một công cụ mã nguồn mở miễn phí là & được gọi là BitDiffer. Thật tuyệt vời, nó có thể so sánh toàn bộ các bản dựng hoặc các tệp DLL đơn lẻ và nó cho thấy hệ thống phân cấp không gian tên để dễ dàng tìm thấy những gì đã thay đổi.

+0

Công cụ rất tốt. Không thể tin rằng nó không có nhấp chuột hữu ích cho đến nay – andreas