2009-03-16 48 views
6

Làm thế nào để viết một công cụ phân tích mã cho vs2008 để ngăn chặn một cuộc gọi khuôn khổ cụ thể, chẳng hạn như GC.WaitForFullGCComplete() hoặc Application.DoEvents()Làm thế nào để viết Phân tích Mã (FxCop) quy tắc để ngăn chặn một cuộc gọi phương thức

Tôi đã cố gắng ghi đè VisitMethodCall trong quy tắc tùy chỉnh của mình, nhưng tôi không thể tìm ra thông số Microsoft.FxCop.Sdk.MethodCall thực sự có trong đó. Không thể tìm thấy ví dụ trên web.

Ai đó có thể chỉ cho tôi đúng hướng không?

+0

Tôi tìm thấy câu trả lời ở đây: http://nervoustych.com/blog/CategoryView,category,Coding,FxCop.aspx Người này sử dụng "bình thường" ghi đè Kiểm tra() phương pháp, sau đó trong trường hợp của một phương thức, lặp qua từng lệnh tìm kiếm cuộc gọi, sau đó khớp với cuộc gọi với tên đầy đủ. – Bill

+4

liên kết này xuất hiện đã chết, có liên kết được cập nhật không? – Maslow

+0

Đây là liên kết chết từ đường dẫn sau: https://web.archive.org/web/20090909101353/http://www.nervoustych.com/blog/CategoryView,category,Coding%2CFxCop.aspx – slolife

Trả lời

0

Tôi nhớ một số Debugging book mà tôi nghĩ rằng có một chương về quy tắc FXCop và thảo luận cách viết một quy tắc. Đối với cuộc sống của tôi, tôi không thể tìm thấy bản sao của mình. Và tôi nghi ngờ bạn sẽ cần phản xạ

-2

Một sự thay thế cho sự lộn xộn của việc viết các quy tắc FxCop sẽ là sử dụng công cụ NDepend. Công cụ này cho phép viết Quy tắc mã trên C# LINQ truy vấnwhat we call CQLinq. Tuyên bố từ chối trách nhiệm: Tôi là một trong những nhà phát triển của công cụ

Nhiều hơn 200 code rules được đề xuất theo mặc định. Tùy chỉnh các quy tắc hiện tại hoặc tạo quy tắc của riêng bạn là đơn giản nhờ cú pháp nổi tiếng C# LINQ.

Làm thế nào để viết một công cụ phân tích mã cho vs2008 để ngăn chặn một cuộc gọi khuôn khổ cụ thể, chẳng hạn như GC.WaitForFullGCComplete() hoặc Application.DoEvents()

Đối với nhu cầu đặc biệt này, sau đây đơn giản CQLinq quy tắc là đủ (chú ý việc sử dụng AllowNoMatch() để làm công việc này cai trị trong mọi tình huống):

// <Name>Don't call these methods</Name> 
warnif count > 0 
from m in Methods 
where m.IsUsing ("System.GC.WaitForFullGCComplete()".AllowNoMatch()) || 
     m.IsUsing ("System.GC.WaitForFullGCComplete(Int32)".AllowNoMatch()) || 
     m.IsUsing ("System.Windows.Forms.Application.DoEvents()".AllowNoMatch()) 
select m 

truy vấn CQLinq thể được chỉnh sửa trực tiếp trong VisualStudio, và đưa ra kết quả ngay lập tức, với các cơ sở duyệt kết quả:

enter image description here

Hãy chính xác rằng những quy tắc có thể được xác nhận live in Visual Studio và tại Build thời gian quá trình, trong một generated HTML+javascript report.

-3

Trong khi nó không phù hợp cho NDepend, hoặc thậm chí FxCop bản thân, tôi vừa đăng một cách tiếp cận rất nhẹ ở đây, hoạt động tốt cho mọi thứ đơn giản như ngăn chặn các cuộc gọi đến các phương pháp cụ thể: http://activesharp.codeplex.com/wikipage?title=Using%20ActiveSharp%20as%20a%20Unit%20Test%20Tool

+0

Bạn sẽ là tốt hơn dán mã có liên quan vào câu trả lời của bạn để chúng tôi có thể đánh giá nó trong một thời trang khép kín –

3

Thay System.Web.HttpUtility.HtmlEncode(System.String) với phương pháp chữ ký mà bạn đang cố gắng tìm và ngăn chặn.

public override ProblemCollection Check(Member member) 
    { 
     if (member is Method) 
     { 
      var callees = new List<Method>(Callees.CalleesFor((Method)member)); 
      foreach (var callee in callees) 
      { 
       if (callee.FullName == "System.Web.HttpUtility.HtmlEncode(System.String)") 
       { 
        Problems.Add(new Problem(GetResolution())); 
       } 
      } 
     } 

     return Problems; 
    } 
+0

Điều này cũng sẽ nhận các phương pháp ghi đè lên HtmlEncode trong các lớp học có nguồn gốc? – Tharwen

+0

@Tharwen, điều này sẽ chỉ tìm các cuộc gọi đến chữ ký được chỉ định: System.Web.HttpUtility.HtmlEncode (System.String) – slolife

+0

OK, cảm ơn. Tôi sẽ phải tìm một cách khác – Tharwen

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