zoukankan      html  css  js  c++  java
  • 【开源】.Net Aop(静态织入)框架 BSF.Aop

    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.AopBSF.Aop.ILRun.exe" msgbox $(TargetDir)

    web环境:

    打开vs-》项目属性-》PostBuildEvent,配置aop运行脚本。(OpenApi.Test.Web替换成具体的项目名) 如:
    xcopy $(SolutionDir)OpenApi.Test.WebinBSF.Aop.dll $(SolutionDir)OpenApi.Test.Webpackages.BSF.Aop /Y
    call "$(SolutionDir)OpenApi.Test.Webpackages.BSF.AopBSF.Aop.ILRun.exe" msgbox $(SolutionDir)OpenApi.Test.Webin

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

  • 相关阅读:
    npm 常用命令
    jquery 滚动事件
    移动端触控事件封装(完整版)
    带动画的分页
    手机号码 座机号码验证
    js常用 弹出确认 取消对话框
    jQuery之select的option怎样绑定事件
    jQuery如何停止元素的animate动画,还有怎样判断是否处于动画状态
    jQuery live()方法使用及变更(事件委托)
    Could not publish server configuration for Tomcat v6.0 Server at localhost. Multiple Contexts have a path of "/tm".
  • 原文地址:https://www.cnblogs.com/chejiangyi/p/5819129.html
Copyright © 2011-2022 走看看