2010-03-17 9 views
9

Tôi biết thiết bị là một kỹ thuật để thêm mã theo dõi động vào các phương pháp để cho phép truy tìm và gỡ lỗi.Thêm mã vào đầu/cuối của các phương thức trong thời gian chạy động

Tôi đã tự hỏi nếu đây chỉ là tùy chọn "Dấu vết", được mã hóa cứng vào CLR để chỉ thêm mã theo dõi hoặc có khả năng thêm bất kỳ mã nào vào các phương thức không?

Ví dụ: tôi muốn kiểm tra điều kiện trong đầu mỗi cuộc gọi phương thức đơn lẻ trong một lớp nhất định (nói cho quyền). Tôi có thể làm điều này thông qua việc thêm mã động vào đầu các phương thức trong thời gian thực hiện không?

Tôi không chắc chắn cách điều này "công cụ" hoạt động, nhưng tôi tự hỏi nếu điều này có thể được sử dụng cho các mục tiêu khác quá, hay không.

Trả lời

4

Về cơ bản những gì bạn cần làm là viết một hồ sơ CLR và sử dụng profiler API trong C++
Bạn cần phải thực hiện các giao diện ICorProfilerCallback.
Những gì bạn đang tìm kiếm nằm trong cuộc gọi lại JITCompilationStarted. Phương thức này được gọi mỗi khi một phương thức được quản lý được gọi và trước khi trình biên dịch jit biên dịch IL thành mã máy. Bất kỳ công việc chèn mã nào trong thời gian chạy đều phải được thực hiện trong JITCompilationStarted.
Bạn có thể xem công cụ phủ sóng nguồn mở part cover làm ví dụ cách thực hiện.

0

Tôi biết PostSharp cho phép bạn thêm 'khía cạnh' với các phương pháp hiện qua việc gán, do đó bạn có thể thêm vào/lối ra dấu vết trên phương pháp của bạn

+0

Xem nhận xét của tôi về Mitch Wheat, vui lòng. – Iravanchi

3

Bạn đang đề cập đến Aspect Oriented Programming (AOP).

Hãy xem PostSharp.

Ngoài ra: Open Source Aspect-Oriented Frameworks in C#

+0

Tôi không đề cập đến AOP, nhưng tôi muốn sử dụng thiết bị đo thời gian chạy cho AOP. Tôi biết một vài khuôn khổ tốt cho AOP, và tôi đã viết một bản thân mình (sẽ sớm được công bố dưới dạng nguồn mở), và tôi đã tự hỏi liệu tôi có thể sử dụng cùng một công cụ đo thời gian chạy để chặn các cuộc gọi hay không. PostSharp là điều gần gũi nhất với những gì tôi có trong tâm trí, nhưng nó hoạt động trong thời gian xây dựng. Có một phiên bản thời gian chạy (mà thực sự thêm mã vào cùng một phương pháp, tương tự như PostSharp)? – Iravanchi

2

Như những người khác đã trả lời, chẳng hạn Cross-cắt Mối quan tâm thường giải quyết bằng Aspect Oriented Programming (AOP).

Một cách để làm AOP là với mã thiết bị đo đạc với các công cụ như PostSharp, nhưng một sự thay thế mà không cần công cụ bổ sung là bằng cách sử dụng Dependency Injection (DI) và mô hình Decorator thiết kế.

Hãy tưởng tượng rằng mã của bạn tiêu thụ giao diện IFoo:

public interface IFoo 
{ 
    string GetStuff(string request); 
} 

Bạn có thể có một implmentation bê tông MyFoo của IFoo, nhưng bạn cũng có thể viết một hoặc một vài trang trí có thể xử lý các khía cạnh khác nhau:

public class AdministratorGuardingFoo : IFoo 
{ 
    private readonly IFoo foo; 

    public AdministratorGuardingFoo(IFoo foo) 
    { 
     if (foo == null) 
     { 
      throw new ArgumentNullException("foo"); 
     } 

     this.foo = foo; 
    } 

    public string GetStuff(string request) 
    { 
     new PrincipalPermission(null, "Administrator").Demand(); 

     return this.foo.GetStuff(request);    
    } 
} 

Bây giờ bạn có thể (có DI Container) bọc MyFoo trong AdministratorGuardingFoo. Tất cả người tiêu dùng tiêu thụ IFoo sẽ không nhận thấy sự khác biệt.