• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

    BSF.Aop: .Net 免费开源,静态Aop织入(直接修改IL中间语言)框架,类似PostSharp(收 ...

    原作者: [db:作者] 来自: 网络 收藏 邀请

    开源软件名称:

    BSF.Aop

    开源软件地址:

    https://gitee.com/chejiangyi/BSF.Aop

    开源软件介绍:

    #BSF.Aop#.Net 免费开源,静态Aop织入(直接修改IL中间语言)框架,类似PostSharp(收费);
    实现前后Aop切面和INotifyPropertyChanged注入方式。

    描述:

    • 静态织入实现,性能几乎接近原生代码编写。
    • 项目结构扩展自BSF基础架构,但dll方面并不依赖BSF.dll,可以独立开发使用。
    • 项目代码量少(也就几个类文件),核心功能插件化开发,便于第三方扩展,阅读,调试,一起来完善。
    • .net Aop静态织入相关的免费开源项目比较少或暂未听闻,故希望开源这块内容,成为同类型开源项目的起点和借鉴。

    by 车江毅

    开源QQ群: .net 开源基础服务 238543768 欢迎交流
    这个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<br/>

    使用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; }    }
    1. INotifyPropertyChanged 示例(暂未测试真正使用效果,详细参考BSF.Aop.Test项目
     [NotifyPropertyChangedAop]    public class User    {        public string Name { get; set; }        public int Age { get; set; }        [NoAop]        public int B { get; set; }    }

    鲜花

    握手

    雷人

    路过

    鸡蛋
    该文章已有0人参与评论

    请发表评论

    全部评论

    专题导读
    热门推荐
    阅读排行榜

    扫描微信二维码

    查看手机版网站

    随时了解更新最新资讯

    139-2527-9053

    在线客服(服务时间 9:00~18:00)

    在线QQ客服
    地址:深圳市南山区西丽大学城创智工业园
    电邮:jeky_zhao#qq.com
    移动电话:139-2527-9053

    Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap