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的项目中:
- 从https://www.postsharp.net/cn/downloads下载zip发行版(名为PostSharp-xxxzip的文件)。
- 将zip文件解压缩到一些本地目录中。
- 使用Visual Studio,添加对相关PostSharp程序集的引用。它们位于lib目录下。
- 使用文本编辑器打开项目文件,并在最后一个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零基础快速入门的主要内容,如果未能解决你的问题,请参考以下文章