我已經看過一些着名的面向AOP的面向.NET的框架,例如來自Microsoft的PostSharp,bltoolkit,Castle,Cecil和Policy Injection Block。也許我是無知的,但似乎這些框架並沒有提供在類被虛擬機加載時注入代碼的能力,而在應用程序可見之前。它們似乎都依賴於應用程序使用工廠或類/方法級別屬性,這些屬性提供編譯時操作程序集所需的元數據。我正在尋找的java.lang.instrument的關鍵特性是簡單地在方法調用周圍注入攔截器而不更改源(方法/類的屬性)或重建現有程序集以注入攔截代碼。是否有java.lang.instrument提供的功能的.Net模擬?
1
A
回答
2
對於.NET的大多數AOP框架都要求您使用特殊類型的工廠或類似工具創建對象,這是正確的。原因是.NET中的(自定義)屬性是被動的,因此您需要某種可以及時檢查這些屬性的框架。
有幾個.NET的AOP框架可以使用代碼生成或IL編織(正常編譯後修改中間語言字節代碼)以允許攔截,但我總是遠離這樣的事情 - 有很多這種方法存在固有問題。
我曾經有一次機會問Anders Hejlsberg我們是否無法在.NET中獲得'主動'屬性,但他的迴應是,如果微軟提供了這樣的能力,他們可能會阻止平臺的所有進一步開發,因爲在不破壞與某人代碼的兼容性的情況下推進.NET是不可能的(我可能會誤解他的答案,但重要的部分是它已被考慮並被拒絕 - 顯然是出於很好的理由)。
也就是說,.NET有一個Instrumentation API,可以攔截任何方法調用。但是,該API是非託管API(它需要您編寫非託管C++代碼),並且(IIRC)要求您自己託管.NET應用程序。這是一個非常嚴厲的做法。您還應該意識到,Instrumentation可能會損害應用程序的性能。
1
你見過這篇文章:comparing IoC frameworks?
相關問題
- 1. WCF(.NET 4.0)是否提供了檢索網頁HTML的功能?
- 2. 他們是否提供Amazon AWS提供的全功能PaaS?
- 3. 在以前的.NET提供此功能
- 4. 使用PInvoke與.NET提供的功能
- 5. 是否有一個功能類似MATLAB的「impixelinfo()」提供的OpenCV?
- 6. RoR是否提供分頁功能?
- 7. 流星是否提供Timepicker功能?
- 8. Atlassian Stash是否提供pastebin/GitHub功能?
- 9. Shopify是否提供沙盒功能?
- 10. .NET中是否提供REXX?
- 11. 是否有一些用於模擬Glib :: Dispatcher的Boost功能?
- 12. 是Win32/.net提供的關鍵「和絃」功能嗎?
- 13. 是否有可能爲所有Cache提供商提供jsr107
- 14. 向具有DLL的.NET門戶提供SaaS功能
- 15. log4j - 是否有提供自動編號功能?
- 16. 應用服務器是否提供了Spring可以提供的功能
- 17. Phriction(Phabricator中的wiki)是否提供了像MediaWiki這樣的模板功能?
- 18. 是否有TweenMax的模擬
- 19. 我是否必須在我的源代碼中處理HiDPI功能,還是由.Net和.Net提供。視窗?
- 20. Boost是否提供打印uBLAS數據類型的功能?
- 21. 此功能是否在最近的Fortran標準中提供?
- 22. Magento是否提供在視圖中使用的實用功能?
- 23. WordPress是否以Joomla的方式提供插件覆蓋功能?
- 24. 是否有IBM DB2的.net 4.0提供程序?
- 25. 是否有可能得到所有的提供的facebook頁面
- 26. 模擬功能
- 27. Axis2是否提供用於確定服務是否已部署的功能?
- 28. R:模擬功能內的功能
- 29. Xcode是否在模擬器中提供了iCal?
- 30. GeckoFX是否具有.NET WebBrowser的所有功能?
我希望避免非託管API。感謝有趣的信息! – 2009-07-02 11:42:00