2011-11-16 49 views
6

Có cách nào để tạo ra lỗi thời gian biên dịch nếu một phương pháp nhất định được gọi không?Ngăn chặn mã .NET gọi các phương thức cụ thể?

Ví dụ, những gì tôi muốn làm là ngăn chặn mã trong một dự án nhất định từ gọi System.Configuration.ConfigurationManager.AppSettings(). Có cách nào để gắn thẻ các dự án hoặc tập tin lớp để nâng cao một lỗi thời gian biên dịch NẾU phương pháp đó được gọi là? Tôi không nghĩ rằng có, vì vậy suy nghĩ của tôi là cách duy nhất để làm điều này là tạo ra một quy tắc FxCop sẽ gắn cờ các cuộc gọi này và làm theo cách đó, nhưng tôi mở cho các ý tưởng khác.

Tôi đang sử dụng .NET 3.5. Bạn không chắc chắn nếu hợp đồng mã 4.0 có thể làm điều này.

Cập nhật

Tôi đặc biệt nói về các phương pháp khung, chứ không phải của riêng tôi, vì vậy tôi không thể đánh dấu chúng là Lỗi thời.

Tại thời điểm này, tôi không quan tâm đến sự phản chiếu.

Ví dụ khác là System.Web.HttpUtility.HtmlEncode, mà tôi muốn tìm và thay thế bằng thư viện AntiXss của Microsoft, nhưng tôi muốn tích hợp một số quy trình kiểm tra trên máy chủ xây dựng của tôi cũng sẽ kiểm tra mã mới .

+0

Bạn có muốn không cho phép gọi phương thức này thông qua phản ánh không? – Vlad

+1

Nếu đó là hội đồng của riêng bạn và bạn có thể biên dịch lại, bạn có thể sử dụng thuộc tính Lỗi thời, nếu điều đó có ích. – asawyer

+0

Tại sao phải bắt đầu nếu bạn không muốn họ sử dụng? –

Trả lời

2

Công cụ NDepend có thể được sử dụng cho điều đó (Tuyên bố từ chối trách nhiệm: Tôi là một trong những nhà phát triển công cụ).

Bạn có thể viết một số Code Rules over LINQ Queries (CQLinq) để kiểm tra bất kỳ loại phụ thuộc nào, chẳng hạn như cuộc gọi phương thức chẳng hạn. Quy tắc mã có thể là checked in Visual Studio sau mỗi lần biên dịch thành công hoặc rules can be checked at build process time.

như một mã số quy tắc CQLinq thể trông giống như:

warnif count > 0 
from m in Application.Methods   
where m.IsUsing("System.Configuration.ConfigurationManager.get_AppSettings()") 
select m 

Nguyên tắc có thể được chuyên tại whim, cấm ví dụ không gian tên phù hợp với một regex, để chứa phương pháp mà gọi phương thức get_AppSettings() getter:

warnif count > 0 
from m in Application.Namespaces.WithNameLike("regex").ChildMethods() 
where m.IsUsing("System.Configuration.ConfigurationManager.get_AppSettings()") 
select m 

Từ NDepend dependency matrix hay dependency graph, bạn cũng có thể nhấp chuột phải một sự phụ thuộc (cell ma trận hoặc đồ thị mũi tên) và tạo ra một quy tắc mã mà cảnh báo nếu phụ thuộc tồn tại (và sau đó chuyên sự cai trị gen nếu bạn cần):

enter image description here

+0

Tôi đã từng sử dụng NDepend UI. Tôi sẽ phải kiểm tra xem tôi có thể tích hợp nó vào kịch bản xây dựng CruiseControl.NET/NAnt của chúng tôi hay không. Điều đó có thể không? – slolife

+0

Có điều này là có thể, hãy đọc tài liệu liên quan đến tích hợp CC.NET của chúng tôi: http://www.ndepend.com/Doc_CI_CCNet.aspx –

4

Bạn có thể write your own rules in FxCop vì vậy có lẽ đó là một tùy chọn.

Tuy nhiên, trong trường hợp này, đối với mã cơ sở hiện tại bạn có thể thấy rằng Ctrl-F (Tìm) trong trình chỉnh sửa của bạn cho "ConfigurationManager.AppSettings" có thể thực hiện một công việc tốt như nhau với nỗ lực ít hơn nhiều ... để thực thi trong tương lai mặc dù bạn có thể xem xét một lộ trình con người của một thư báo email cho nhóm phát triển ...

Được đánh dấu bởi người nhận xét ở trên và đáng chú ý cho những người khác có mục tiêu tương tự, là nếu điều này đề cập đến một hàm trong mã cơ sở của riêng bạn (câu hỏi này là không phải là đề cập đến), bạn có thể sử dụng thuộc tính [Obsolete].

+0

Mặc dù tôi đồng ý rằng một email ** nên ** hoạt động, tôi muốn một thứ cụ thể hơn một chút về mặt xác thực. – slolife

+1

Có thể nói với nhóm rằng họ nợ 6 lon bia cho những người còn lại trong nhóm vì đã phá vỡ các tiêu chuẩn mã hóa !? Trong tất cả các mức độ nghiêm trọng, FxCop với quy tắc tùy chỉnh sẽ giúp bạn xác thực nó, nhưng đó chỉ miễn là dev (hoặc máy chủ xây dựng) cài đặt quy tắc và sử dụng FxCop đúng cách ... – Reddog

Các vấn đề liên quan