2009-07-02 74 views
1

我已經看過一些着名的面向AOP的面向.NET的框架,例如來自Microsoft的PostSharp,bltoolkit,Castle,Cecil和Policy Injection Block。也許我是無知的,但似乎這些框架並沒有提供在類被虛擬機加載時注入代碼的能力,而在應用程序可見之前。它們似乎都依賴於應用程序使用工廠或類/方法級別屬性,這些屬性提供編譯時操作程序集所需的元數據。我正在尋找的java.lang.instrument的關鍵特性是簡單地在方法調用周圍注入攔截器而不更改源(方法/類的屬性)或重建現有程序集以注入攔截代碼。是否有java.lang.instrument提供的功能的.Net模擬?

回答

2

對於.NET的大多數AOP框架都要求您使用特殊類型的工廠或類似工具創建對象,這是正確的。原因是.NET中的(自定義)屬性是被動的,因此您需要某種可以及時檢查這些屬性的框架。

有幾個.NET的AOP框架可以使用代碼生成或IL編織(正常編譯後修改中間語言字節代碼)以允許攔截,但我總是遠離這樣的事情 - 有很多這種方法存在固有問題。

我曾經有一次機會問Anders Hejlsberg我們是否無法在.NET中獲得'主動'屬性,但他的迴應是,如果微軟提供了這樣的能力,他們可能會阻止平臺的所有進一步開發,因爲在不破壞與某人代碼的兼容性的情況下推進.NET是不可能的(我可能會誤解他的答案,但重要的部分是它已被考慮並被拒絕 - 顯然是出於很好的理由)。

也就是說,.NET有一個Instrumentation API,可以攔截任何方法調用。但是,該API是非託管API(它需要您編寫非託管C++代碼),並且(IIRC)要求您自己託管.NET應用程序。這是一個非常嚴厲的做法。您還應該意識到,Instrumentation可能會損害應用程序的性能。

+0

我希望避免非託管API。感謝有趣的信息! – 2009-07-02 11:42:00

相關問題