2011-11-26 8 views
6

Tôi có một assembly cung cấp một API và được sử dụng bởi một số assembly khác. Tôi cần xác minh rằng phiên bản API dll mới hơn vẫn tương thích với các hội đồng cũ hơn đang sử dụng phiên bản API cũ hơn.Làm thế nào tôi có thể kiểm tra tính tương thích ngược của API giữa các assembly .net

Tôi đã tìm thấy một vài câu hỏi mà hỏi giống nhau, nhưng không có câu trả lời mà giải quyết vấn đề của tôi:

công cụ đề nghị chỉ có thể so sánh hai hội đồng và nói rằng nếu có những thay đổi có thể xảy ra trong API, nhưng không phải nếu API mới nhất thực sự phá vỡ hội đồng cũ sử dụng nó. Tôi muốn tìm một công cụ hoặc viết một bài kiểm tra có thể kiểm tra xem mỗi dll cũ có thể hoạt động với dll API mới của tôi hay không.

Đối với những thay đổi trong API nhiều khả năng tôi sẽ chỉ mở rộng nó, nhưng mặc dù nó vẫn có thể phá vỡ mã trong hội đồng cũ hơn. Một số ví dụ về sự thay đổi đó có thể được tìm thấy ở đây:

Đối nay là giải pháp duy nhất tôi thấy là để biên dịch mã nguồn của các hội đồng cũ với các API mới nhất , nhưng tôi chỉ muốn làm điều đó với các hội đồng và thêm chúng như là một phần của các bài kiểm tra đơn vị của tôi. Có cách nào tốt hơn tôi có thể xử lý điều đó không?

chỉnh sửa:

Tôi đang tìm một công cụ mà sẽ có thể tự động hóa quá trình thẩm tra khả năng tương thích ngược giữa cụm .net. (dòng lệnh hoặc với một số api quá)

+1

Có thể do thiếu hiểu biết của tôi, nhưng tôi không hiểu công cụ bạn đang tìm kiếm có thể làm tốt hơn hoặc dễ dàng hơn mà chỉ cần biên dịch các nguồn kết hợp. Ý tôi là, công cụ này sẽ cần cả nguồn cũ và nguồn mới để có thể phân tích những thay đổi đột phá theo cách bạn dự định, phải không? Có lẽ bạn có thể điền vào tôi. –

+0

@GertArnold Tôi đã cập nhật câu hỏi của mình, tôi muốn tự động hóa quy trình này, vì vậy có thể không thuận tiện khi biên dịch mã nguồn theo cách thủ công hoặc chạy công cụ theo cách thủ công – username

Trả lời

9

Những gì bạn muốn là làm một sự khác biệt và tạo ra một danh sách các thay đổi phá vỡ. Sau đó, bạn muốn tìm kiếm nếu các hội đồng của bạn không sử dụng bất kỳ API bị hỏng nào. Bạn có thể làm điều này với công cụ ApiChange để làm khác và tìm bất kỳ người dùng bị ảnh hưởng nào của nó.

Để làm cho nó cụ thể hơn. Nếu bạn đã loại bỏ một phương thức từ một giao diện thì bạn cần phải tìm tất cả những người triển khai và người dùng của phương thức này trong các lớp sử dụng phương thức giao diện hoặc bất kỳ lớp nào thực hiện phương thức này.

ApiChange có thể tìm kiếm người triển khai và người dùng phương pháp cụ thể trên dòng lệnh bằng lệnh -whoimplementsinterface và -whousesmethod. Nó không phải là tự động tại dòng lệnh nhưng bạn có thể trực tiếp sử dụng ApiChange.Api.dll để tự động hoá các truy vấn này.

Edit1:

Tôi chỉ quên: Các công cụ ApiChange thực sự có functionality bạn quan tâm rồi. Đây là lựa chọn

-ShowrebuildTargets -new -old [-old2] -searchin

Chúng tôi đã sử dụng nó trong bộ phận của chúng tôi với kết quả tốt. Dấu hiệu duy nhất là các tệp XML Intellisense.Nếu mục tiêu khác không sử dụng phương thức đã loại bỏ nhưng tham chiếu nó bên trong XmlDoc trình biên dịch sẽ viết một cảnh báo rằng một phương thức không tồn tại đã được tham chiếu. Điều này là khá khó nắm bắt và sẽ liên quan đến phân tích cú pháp các tập tin docu intellisense là tốt. Nhưng đây là một trường hợp khá cạnh tranh.

+0

sẽ thêm một quá tải mới có thể dẫn đến sự mơ hồ trong các cuộc gọi phương thức trong các assembly sử dụng API của tôi? – username

+0

Một sự xuất hiện của trình biên dịch sẽ không bị phá vỡ. Tôi giả sử bạn muốn tìm các thay đổi đột phá sẽ yêu cầu biên dịch lại. Nó có thể xảy ra rằng trong một biên dịch lại một số phương pháp khác sẽ được sử dụng hơn trước nhưng các mục tiêu đã được xây dựng sẽ có thể làm việc với các phương pháp mà họ đã được liên kết chống lại. Nếu bạn muốn thêm hỗ trợ như vậy, bạn sẽ cần phải thực hiện các phần của ECMA C# spec để đối phó với các quá tải phương thức và cách trình biên dịch C# giải quyết chúng. –

+0

Cảm ơn, tôi vừa thử nghiệm trường hợp tôi đã mô tả trong bình luận đầu tiên của tôi và nó hoạt động tốt – username