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 车江毅

最新文章

  1. vim IDE平台-打造属于自己的配置
  2. WebStorm工具插件下载安装
  3. 【dom4j】解析xml为map
  4. Linux解压安装与卸载
  5. Nginx + Tomcat 配置
  6. 使用MFC中的AfxBeginThread创建多线程
  7. 微信公众账号怎么获取微信原始ID
  8. java二进制文件复制
  9. java_web学习(十) 显示mysql中的数据
  10. LNMP下动静分离部署phpmyadmin软件包
  11. Vue为v-html中标签添加CSS样式
  12. centos安装swoole
  13. 熵 互信息 Gini指数 和 不纯度
  14. PHP中定义常量
  15. QLocalServer和QLocalSocket单进程和进程通信
  16. 2018数学建模A题优秀论文:高温作业专用服装设计
  17. SpringCloud系列十一:自定义Feign
  18. 第3章 springboot接口返回json 3-1 SpringBoot构造并返回一个json对象
  19. OpenStack Weekly Rank 2015.08.10
  20. MySQL 5.7传统复制到GTID在线切换(一主一从)

热门文章

  1. PHP搭建大文件切割分块上传功能
  2. Javascript生成二维码(QR)
  3. Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示
  4. 利用on和off方法编写高效的js代码
  5. 【原】AFNetworking源码阅读(二)
  6. CSS浮动、定位
  7. dubbox微服务实例及引发的“血案”
  8. SSH框架和Redis的整合(2)
  9. 【架构设计】分布式文件系统 FastDFS的原理和安装使用
  10. javascript arguments(转)