2009-08-26 26 views
7

Tôi tò mò muốn tìm hiểu xem .NET có hỗ trợ bất kỳ dạng chặn động nào của các cuộc gọi phương thức (hoặc các yêu cầu thuộc tính) khi chạy không. Tức là, bạn có thể chặn cuộc gọi đến một đối tượng không có thông tin biên dịch tĩnh như giao diện (dọc theo các dòng của CORBA DII (link text) hoặc IDispatch của COM).Đánh chặn động các cuộc gọi trong .NET

Nếu không, tính năng 'Đối tượng được nhập động' mới trong trợ giúp C# 4.0 có liên quan đến vấn đề này hay không.

+0

liên quan mạnh mẽ: http://stackoverflow.com/questions/25803/how-do-i-intercept-a-method-call-in-c –

+0

Is it mạnh liên quan? Tôi không có lớp mà tôi có thể thêm thuộc tính vào. – karmasponge

+0

Tôi hiện đang điều tra 'RealProxy' và 'Application Injection Block'. – karmasponge

Trả lời

16

Không có gì tích hợp cho phép bạn chặn một đối tượng mà bạn không thể kiểm soát việc khởi tạo. Tương tự như vậy, sẽ không có cơ sở mới cho việc này trong .net 4.0 sắp tới.

Nếu bạn có thể kiểm soát instantiation:

  1. Nếu đối tượng của bạn có thể MarshalByRef bạn có thể sử dụng RealProxy.
  2. Bạn có thể sử dụng một vài thùng chứa IOC, ví dụ: LinFu, Castle Dynamic Proxy
  3. Bạn có thể sử dụng công cụ như PostSharp, Mono Cecil hoặc Microsoft CCI để viết lại các hội đồng của bạn với các trường hợp chặn làm bước biên dịch bài đăng.

Nếu bạn không thể kiểm soát instantiation

  1. Bạn có thể sử dụng ICorDebug - Net gỡ lỗi API mà là thực sự khó khăn để sử dụng và nặng nề.
  2. Bạn có thể sử dụng ICorProfiler - API lược tả .Net cũng khá phức tạp để sử dụng.

Ngoài ra, bạn có thể nhìn vào một ngôn ngữ động như IronRuby, trong đó có một built-in alias_methoddefine_method tốt lành (mà cho phép bạn xác định lại bất cứ điều gì), do đó ngăn chặn nướng trong.


. NET 4.5 là giới thiệu một phương pháp để ReJIT phương pháp cung cấp một móc cho phương pháp đánh chặn (miễn là bạn không chạy một GC đồng thời/bg và phương pháp không được gạch chân)

+0

Bạn cũng có thể sử dụng RealProxy nếu bạn đang sử dụng giao diện. – kyoryu

+0

Tôi nghĩ rằng 'Castle Dynamic Proxy' có vẻ phù hợp nhất với những gì tôi đang tìm kiếm. API của nó là tốt đẹp và đơn giản. – karmasponge

+1

Nội dung hay. Một điều cần thêm - Mono.Cecil có một số chồng chéo với PostSharp. –

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