PostSharp零基础快速入门

Posted honk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PostSharp零基础快速入门相关的知识,希望对你有一定的参考价值。

产品安装

    组件说明

    PostSharp由以下部件组成:

  • PostSharp Tools for Visual Studio
  • NuGet packages
  • Zip distribution

    PostSharp Tools for Visual Studio

这是PostSharp的用户界面。它扩展了Visual Studio编辑器,并提供了一个新菜单,选项页,工具箱窗口,诊断,代码操作和调试增强功能。

NuGet packages

所有构建时和运行时工件都作为NuGet软件包发布。构建项目需要构建时软件包,但是执行应用程序仅需要运行时软件包的内容。如果您构建使用PostSharp但未定义自定义方面的NuGet程序包,则您的程序包应仅引用相关的PostSharp运行时程序包,而不是构建时程序包。

Zip distribution

对于无法使用NuGet的团队,PostSharp还作为一个zip存档提供,其中包含所有NuGet软件包中否则包含的文件。

在此归档文件中,lib文件夹包含运行时库(redistributables),而tools 文件夹包含所有构建时组件。

 

    安装方式

直接安装

PostSharp Tools for Visual Studio完成安装配置向导。系统将要求您输入许可证密钥或开始试用期。该向导可能会询问安装NuGet软件包管理器或卸载PostSharp用户界面的权限。

      技术图片

    技术图片

    技术图片

 

离线安装

  如果是内网环境,可以下载离线包手动配置,方法如下:

  将PostSharp添加到项目中的最常见方法是安装PostSharp NuGet软件包。使用NuGet软件包管理器的主要好处是,它提供了一种标准方法来安装和管理.NET项目的所有依赖项。

  NuGet的早期版本存在一些问题,这使得它对于某些团队来说是不切实际的解决方案。出于这个原因,我们允许通过下载并提取标准zip文件来使用不带NuGet的PostSharp。但是,没有NuGet的安装过程比使用NuGet的安装过程要麻烦得多。

  要将PostSharp安装到没有NuGet的项目中:

  1. https://www.postsharp.net/cn/downloads下载zip发行版(名为PostSharp-xxxzip的文件)。
  2. 将zip文件解压缩到一些本地目录中。
  3. 使用Visual Studio,添加对相关PostSharp程序集的引用。它们位于lib目录下。
  4. 使用文本编辑器打开项目文件,并在最后一个Import元素之后添加以下行。

  <Import Project="......postsharpToolsPostSharp.targets" />

 

    和谐方式

    1. PostSharp UI

      找到插件路径,每个版本可能ID不一样。

    技术图片

    找到模块***AppDataLocalMicrosoftVisualStudio15.0_e9e92180Extensionsvablzwf1.oanPostSharp.Settings目录,替换插件目录下的PostSharp.Compiler.Settings.dll

    技术图片

    2. Nuget

        Nuget安装完成后,找到 %ProgramData%PostSharp6.5.4in.Release et472 路径,替换目录下的PostSharp.Compiler.Settings.dll

        技术图片

    3. 换注册表中的临时License

    HKEY_CURRENT_USERSoftwareSharpCraftersPostSharp 3LicenseKey

技术图片

License1: F5LWRETPGPDHWVZ7FURLRTHZLX-ZQQQQQQQWTQYQYYRZ59J54RML3JKHQF56GPLXYENCG4YU8M3Z57S79QVBW95S8MR6V8DM69FXNWSF3RAAUPA

License2: UVY2VZGM4HYXWLMAFEX6B9VTNX-ZQQQQQQQWTQYQYK2JMRT9XAAUSCVP8GFPKQSXCHX26BEK5QFKW4LMAH9D4LK8SAYNYMNTXM43EHKKLVAAUPA

 

4. 查看License是否生效?

    技术图片

 

 

    5. 离线版安装的和谐方式参考以上步骤,只是dll替换路径切换到Tools目录下。

    技术图片

代码调试

    继承特性

      

    [PSerializable]
    public class LoggingAspect : OnMethodBoundaryAspect
    {

        public override void OnEntry(MethodExecutionArgs args)
        {
            Console.WriteLine("The {0} method has been entered.", args.Method.Name);
        }

        public override void OnSuccess(MethodExecutionArgs args)
        {
            Console.WriteLine("The {0} method executed successfully.", args.Method.Name);
        }

        public override void OnExit(MethodExecutionArgs args)
        {
            Console.WriteLine("The {0} method has exited.", args.Method.Name);
        }

        public override void OnException(MethodExecutionArgs args)
        {
            
            Console.WriteLine("An exception was thrown in {0}.", args.Method.Name);
            args.FlowBehavior = FlowBehavior.Continue;

        }

    }
    /// <summary>
    /// 目前记录了方法的执行时间,输出样例:
    /// [2016-04-12 10:39:36]方法 GetUser 执行结束,用时 164ms
    /// </summary>
    [Serializable]
    public class LogsAttribute : OnMethodBoundaryAspect, IInstanceScopedAspect
    {
        [NonSerialized]
        private Stopwatch _stopwatch;

        public object CreateInstance(AdviceArgs adviceArgs)
        {
            return MemberwiseClone();
        }

        public override void OnEntry(MethodExecutionArgs eventArgs)
        {
            _stopwatch.Restart();
            Arguments arguments = eventArgs.Arguments;
            StringBuilder sb = new StringBuilder();
            ParameterInfo[] parameters = eventArgs.Method.GetParameters();
            for (int i = 0; arguments != null && i < arguments.Count; i++)
            {
                //进入的参数的值
                sb.Append(parameters[i].Name + "=" + arguments[i] + "");
            }
            LoggerHelper.Writelog("方法 " + eventArgs.Method.Name + " 开始执行,参数为:" + sb);

        }

        public override void OnSuccess(MethodExecutionArgs args)
        {
            _stopwatch.Stop();
            LoggerHelper.Writelog(
                "方法 " + args.Method.Name + " 执行结束,用时 " + _stopwatch.ElapsedMilliseconds + "ms",
                LogLevel.Success
            );
        }

        public override void OnException(MethodExecutionArgs args)
        {
            _stopwatch.Stop();
            LoggerHelper.Writelog(
                "方法 " + args.Method.Name + " 执行出错,错误为:" + args.Exception,
                LogLevel.Error
            );
            args.FlowBehavior = FlowBehavior.Continue;
        }

        /// <summary>
        /// 初始化类必须的方法
        /// </summary>
        public void RuntimeInitializeInstance()
        {
            _stopwatch = new Stopwatch();
        }
    }


    public static class LoggerHelper
    {
        public static void Writelog(string err, LogLevel lvl=LogLevel.Success)
        {
            System.Diagnostics.Debug.Print(err);
        }
    }

    public enum LogLevel
    {
        Debug,
        Info,
        Waring,
        Error,
        Success
    }

 

    代码调试

      

        [Logs]
        public void Test()
        {
            string s="";
            for (int i = 0; i < 5000; i++)
            {
                s += i.ToString();
            }
            //测试异常
            object o = null;
            System.Diagnostics.Debug.Print(o.GetType().FullName);
            System.Diagnostics.Debug.Print(s);
        }
方法 Test 开始执行,参数为:
“PostSharpApp2.exe”(CLR v4.0.30319: PostSharpApp2.exe): 已加载“C:WindowsMicrosoft.NetassemblyGAC_MSILmscorlib.resourcesv4.0_4.0.0.0_zh-Hans_b77a5c561934e089mscorlib.resources.dll”。模块已生成,不包含符号。
引发的异常:“System.NullReferenceException”(位于 PostSharpApp2.exe 中)
方法 Test 执行出错,错误为:System.NullReferenceException: 未将对象引用设置到对象的实例。
   在 PostSharpApp2.Form1.Test() 位置 F:Visual Studio 2017SourceWindowsFormsApp1PostSharpApp2Form1.cs:行号 48

 

    

总结

    整体体验较好,暂时没有遇到其它问题。后续如果有需要记录的,再继续贴出。

  官方参考链接地址:

  https://www.postsharp.net/documentation

  https://samples.postsharp.net/

  https://doc.postsharp.net/method-decorator

 

以上是关于PostSharp零基础快速入门的主要内容,如果未能解决你的问题,请参考以下文章

前端零基础快速入门JavaScript

[易学易懂系列|rustlang语言|零基础|快速入门|]

[易学易懂系列|golang语言|零基础|快速入门|]

[易学易懂系列|rustlang语言|零基础|快速入门|]

[易学易懂系列|rustlang语言|零基础|快速入门|(18)|use关键词]

Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 2. 变量