C# AOP实现

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting.Proxies;

namespace Aop
{
    public class AopAttribute : ProxyAttribute
    {
        public override MarshalByRefObject CreateInstance(Type serverType)
        {
            AopProxy realProxy = new AopProxy(serverType);
            return realProxy.GetTransparentProxy() as MarshalByRefObject;
        }       


    }
}

 AopProxy.cs

    using System;  
    using System.Collections.Generic;  
    using System.Text;  
    using System.Reflection.Emit;  
    using System.Runtime.Remoting.Proxies;  
    using System.Runtime.Remoting.Messaging;  
    using System.Runtime.Remoting.Activation;  
    using System.Windows.Forms;  
      
    namespace Aop  
    {  
        public class AopProxy : RealProxy  
        {  
            public AopProxy(Type serverType)  
                : base(serverType) { }  
      
            public override IMessage Invoke(IMessage msg)  
            {  
                if (msg is IConstructionCallMessage)  
                {  
                    IConstructionCallMessage constructCallMsg = msg as IConstructionCallMessage;  
                    IConstructionReturnMessage constructionReturnMessage = this.InitializeServerObject((IConstructionCallMessage)msg);  
                    RealProxy.SetStubData(this, constructionReturnMessage.ReturnValue);  
                    Console.WriteLine("Call constructor");
                    return constructionReturnMessage;  
                }  
                else  
                {  
                    IMethodCallMessage callMsg = msg as IMethodCallMessage;  
                    IMessage message;  
                    try  
                    {  
                        object[] args = callMsg.Args;  
                        object o = callMsg.MethodBase.Invoke(GetUnwrappedServer(), args);  
                        message = new ReturnMessage(o, args, args.Length, callMsg.LogicalCallContext, callMsg);  
                    }  
                    catch (Exception e)  
                    {  
                        message = new ReturnMessage(e, callMsg);  
                    }  
                    Console.WriteLine(message.Properties["__Return"].ToString());
                    return message;  
                }  
            }  
        }  
    }  

 AopAttribute.cs

    using System;  
    using System.Collections.Generic;  
    using System.Text;  
      
    namespace Aop  
    {  
        [AopAttribute]  
        public class AopClass : ContextBoundObject  
        {  
            public string Hello()  
            {  
                return "welcome";  
            }  
      
        }  
    }  

 AopClass.cs

posted @ 2014-03-11 10:20  Byrd  阅读(426)  评论(0编辑  收藏  举报