【開源】.Net 免費開源,靜態Aop織入(直接修改IL中間語言)框架,類似PostSharp(收費);實現前後Aop切麵和INotifyPropertyChanged註入方式,性能接近原生編碼方式實現。 ...
BSF.Aop
.Net 免費開源,靜態Aop織入(直接修改IL中間語言)框架,類似PostSharp(收費);
實現前後Aop切麵和INotifyPropertyChanged註入方式。
開源地址: https://git.oschina.net/chejiangyi/BSF.Aop
開源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文件等)
備註:
- 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 腳本。
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)
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\
使用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 車江毅