环境:VS 2012PostSharp-4.1.28 (下载地址)https://visualstudiogallery.msdn.microsoft.com/a058d5d3-e654-43f8-a308-c3bdfdd0be4a/file/89212/69/PostSharp-4.1.28.exelog4net 2.0.3首先搭建环境:下载好PostSharp 之后进行安装。之后创建项目1、引用PoastSharpPoastSharp引用方式如下:VS工具 —>> NuGet 程序包管理 —>> 管理解决方案的NuGet程序包 出现如下图:搜索PostSharp 安装等待...安装完成之后会在项目的解决方案同级目录下出现下列文件:同时解决方案里面的项目会自动出现PostSharp的引用、如果没有自动引用,我们就手动引用下就好了。 根据.NET Framework的版本,选择对应的dllPostSharp.dll 安装引用已经OK了。2、log4net安装引用打开 VS工具 —>> NuGet 程序包管理 —>> 程序包管理器控制台在控制台中输入 PM> Install-Package log4net (PM> 是已经有了的)敲回车键然后安心等待...(上面的红色的Error是因为网速比较慢,没有Load出来, 没有关系再来一次)下面第二次可以看见已经安装成功,并且把我的机器上老版本替换掉了。 干得漂亮!!!如PostSharp 一样,也会在解决方案下面出现lib文件, 如果项目里面没有引用的就手动引用好了。接下来开始正真的干活了......首先配置好log4net.config下面是我习惯的步骤:1、在应用程序下创建 App.config 文件2、修改App.config 文件的内容(直接复制替换好了,详细的配置项就不说明了)View Code3、接着很重要的一步,不然配置的都白干了...打开AssemblyInfo.cs文件,在文件最后添加一行代码[assembly: log4net.Config.XmlConfigurator(Watch = true)]好的,到此。log4net 已经配置完成。 可以先测试一下log4net 是否可以正常工作创建一个空的WinForm,添加如下代码using System.Linq;using System.Reflection;using System.Text;using System.Windows.Forms;using log4net;namespace PostSharp.Demo{ public partial class TestLog4netFrm : Form { public static log4net.ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); public TestLog4netFrm() { InitializeComponent(); } private void TestLog4netFrm_Load(object sender, EventArgs e) { _logger.Debug("test log4net "); } }}View Code然后生成运行。运行成功之后,关掉Form。 打开bin/Debug 可以看见有一个Log文件夹里面会生成一个日志文件,打开可以看见我们刚才写的 test log4net好的。 干得漂亮!!! 已经成功一半了。即使不用postSharp也可以完成日常的打Log了。为了继续完善,把PostSharp使用起来,让它给我们自动的打Log。1、创建项目 PostSharp.Core ,创建文件TraceAttribute.csTraceAttribute.cs 代码如下:(格式可以根据需要自己调整的...)using System;using System.Collections.Generic;using System.Text;using PostSharp.Aspects;using PostSharp.Extensibility; using System.Reflection;namespace PostSharp.Core{ [Serializable] public sealed class TraceAttribute : OnMethodBoundaryAspect { // Create a logger for use in this class, called only once private static readonly log4net.ILog _logger; private string _methodName; // These fields are initialized at runtime. They do not need to be serialized. [NonSerialized] private int _hashCode; static TraceAttribute() { if (!PostSharpEnvironment.IsPostSharpRunning) { _logger = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); } } // Default constructor, invoked at build time. public TraceAttribute() { // Do nothing } // Invoked only once at runtime from the static constructor of type declaring the target method. public override void CompileTimeInitialize(MethodBase method, AspectInfo aspectInfo) { _methodName = method.DeclaringType.Name + "." + method.Name; } // Invoked only once at runtime from the static constructor of type declaring the target method. public override void RuntimeInitialize(MethodBase method) { _hashCode = this.GetHashCode(); } // Invoked at runtime before that target method is invoked. public override void OnEntry(MethodExecutionArgs args) { _logger.DebugFormat(">>> Entry [{0}] {1}", _hashCode, _methodName); } // Invoked at runtime after the target method is invoked (in a finally block). public override void OnExit(MethodExecutionArgs args) { _logger.DebugFormat("<<< Exit [{0}] {1}", _hashCode, _methodName); } // Invoked at runtime when there is unhandled exception from the target method public override void OnException(MethodExecutionArgs args) { string expMsg = string.Format("!!! Exception [{0}] {1} {2}", _hashCode, _methodName, args.Exception.Message); _logger.ErrorFormat(expMsg, args.Exception); } // Invoked at runtime when await starts in the target method public override void OnYield(MethodExecutionArgs args) { _logger.DebugFormat("--- OnYield [{0}] {1}", _hashCode, _methodName); } // Invoked at runtime when await resumed in the target method public override void OnResume(MethodExecutionArgs args) { _logger.DebugFormat("--- OnResume [{0}] {1}", _hashCode, _methodName); } }}View Code2、很重要的一步,PostSharp.Core 项目的 AssemblyInfo.cs 文件也需要在最后加上一句代码。同上[assembly: log4net.Config.XmlConfigurator(Watch = true)]好了,到此。 安装,引用,配置已经全部结束。 开始测试...创建新的Form,(什么都不需要写,就使用Load事件好了)using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using log4net;using PostSharp.Core;using System.Reflection;namespace PostSharp.Demo{ public partial class TestPostSharpFrm : Form { public static log4net.ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); public TestPostSharpFrm() { InitializeComponent(); } [Trace] private void TestPostSharpFrm_Load(object sender, EventArgs e) { } }}View Code然后直接运行、可以看见下面就是我们在TraceAttribute.cs 中配置好的输出格式全部OK。 干的非常漂亮!!!From需要应用下面的命名空间using log4net;using PostSharp.Core;using System.Reflection;可以看看编译过后的代码:1、未使用PostSharp 的代码2、使用PostSharp 打过标签的代码
不难看出,PostSharp,会在编译之后把Log注入到代码中去。同时每个方法的执行位置一目了然...