【開源】.Net Aop(靜態織入)框架 BSF.Aop

BSF.Aop

.Net 免費開源,靜態Aop織入(直接修改IL中間語言)框架,相似PostSharp(收費);
實現先後Aop切面和INotifyPropertyChanged注入方式。git

開源地址: https://git.oschina.net/chejiangyi/BSF.Aopweb

開源QQ羣: .net 開源基礎服務  238543768  歡迎交流

描述:
架構

  • 靜態織入實現,性能幾乎接近原生代碼編寫。
  • 項目結構擴展自BSF基礎架構,但dll方面並不依賴BSF.dll,能夠獨立開發使用。
  • 項目代碼量少(也就幾個類文件),核心功能插件化開發,便於第三方擴展,閱讀,調試,一塊兒來完善。
  • .net Aop靜態織入相關的免費開源項目比較少或暫未聽聞,故但願開源這塊內容,成爲同類型開源項目的起點和借鑑。

 

使用配置

1)項目引用BSF.Aop.dll,引用Mono.Cecil.dll,引用Mono.Cecil.Pdb.dll。
2)項目啓動代碼添加AopStartLoader.Start();一句代碼便可。
(該代碼用於自動注入掃描和vs項目環境自動配置,導出相關exe文件等)框架

備註:ide

  • Web項目在Application_Start中添加
  • Winform項目在Pragram.Main中添加

自動化配置(默認推薦)

Build項目,而後直接運行調試項目。性能

備註:測試

  • AopStartLoader.Start();這句代碼第一次項目運行會報錯,由於Aop環境不曾自動搭建;第一次運行並自動搭建成功後,之後運行都是自動注入的。
  • 默認會在項目下生成「packages.BSF.Aop」文件夾,並在vs項目PostBuildEvent事件中注入「aop運行腳本」,具體參考如下「手工配置內容」。

手工配置 (遇到問題,推薦使用)

1)配置Aop注入目錄。
vs項目下新建packages.BSF.Aop 目錄,裏面分別包含BSF.Aop.ILRun.exe,BSF.Aop.dll,Mono.Cecil.Pdb.dll,Mono.Cecil.dll 這幾個文件。
2)配置PostBuildEvent 腳本。ui

winform環境:

打開vs-》項目屬性-》PostBuildEvent,配置aop運行腳本。如:
xcopy $(OutDir)BSF.Aop.dll $(ProjectDir)packages.BSF.Aop\ /Y
call "$(ProjectDir)packages.BSF.Aop\BSF.Aop.ILRun.exe" msgbox $(TargetDir)spa

web環境:

打開vs-》項目屬性-》PostBuildEvent,配置aop運行腳本。(OpenApi.Test.Web替換成具體的項目名) 如:
xcopy $(SolutionDir)\OpenApi.Test.Web\bin\BSF.Aop.dll $(SolutionDir)\OpenApi.Test.Web\packages.BSF.Aop\ /Y
call "$(SolutionDir)\OpenApi.Test.Web\packages.BSF.Aop\BSF.Aop.ILRun.exe" msgbox $(SolutionDir)\OpenApi.Test.Web\bin\.net

使用demo示例

1) 先後Aop切面示例 (詳細參考BSF.Aop.Test項目

public class AroundAopTest { [MyAroundAop] [AttributeInfo(Des = "測試2")] public void Method(TempInfo info, out int b,int a=1) { a = 222; b = 3; System.Console.WriteLine("Hello world!"+a); } } public static class AroundAopTest2 { [MyAroundAop][AttributeInfo(Des ="測試")] public static void Method2(TempInfo info, int a = 1) { a = 222; System.Console.WriteLine("Hello world!" + a); } } public class MyAroundAop : Aop.Attributes.Around.AroundAopAttribute { public MyAroundAop() { } public override void Before(AroundInfo info) { var att = info.Method.CustomAttributes.ToList()[0]; info.Params["a"] = 55; System.Console.WriteLine("before" + info.Params["a"]); } public override void After(AroundInfo info) { System.Console.WriteLine("after"+ info.Params["a"]); } } public class TempInfo { public int T1 { get; set; } } public class AttributeInfo : System.Attribute { public string Des { get; set; } }

2) INotifyPropertyChanged 示例(暫未測試真正使用效果,詳細參考BSF.Aop.Test項目

[NotifyPropertyChangedAop]
    public class User { public string Name { get; set; } public int Age { get; set; } [NoAop] public int B { get; set; } }

 

by 車江毅

相關文章
相關標籤/搜索