上一篇我们使用了一个通用JSON协议约定来进行达到远程调用的目的。
但是从实现上,我们需要不断的在所有的方法上添加拦截,并且判断拦截,然后执行,这就达到了一个比较繁琐的目的。

之前我们尝试过使用代码生成器,直接生成。

构造基类,TestClassA
然后使用代码生成器,构造第二个类,TestClassAProxy。
所有需要的方法,我们都采用虚函数,然后重载,直接调用Base.Func();
这样也就完成了任务,这个方法的好处,代码生成简单,但是需要替换使用类别。
相对来说实现成本还比较低,对下面说的方法没什么信心的同学,可以采用这种实现方式。

然后我们说到到了本篇的主角,AOP利器 PostSharp
(额,商业软件,但是45天免费试用,我不会告诉你删了注册表后可以无限免费试用)

来看例子:

   [Serializable]
//[DebuggerNonUserCode]
public sealed class ProxyAttribute : OnMethodBoundaryAspect
{ //[DebuggerNonUserCode]
public override void OnException(MethodExecutionArgs args)
{
base.OnException(args);
WindNet.RemoteCall.Instance.DoError(args.Exception);
args.FlowBehavior = FlowBehavior.Continue;
//不抛出 } //[DebuggerNonUserCode]
public override void OnSuccess(MethodExecutionArgs args)
{
base.OnSuccess(args);
WindNet.RemoteCall.Instance.DoCallBack(args.ReturnValue, __cid);
} private WindNet.RPC.RequestObj __cid; //[DebuggerNonUserCode]
public override void OnEntry(MethodExecutionArgs args)
{
var callback = args.Arguments.Last(); var methodName =args.Method.DeclaringType.Name + "." + args.Method.Name;
var outargs = new List<object>();
for (int i = 0; i < args.Arguments.Count - 1; i++)
{
outargs.Add(args.Arguments[i]);
}
__cid = WindNet.RemoteCall.Instance.DoCall(callback as Delegate, args.Instance as IOpItem, methodName, outargs.ToArray()); if (WindNet.RemoteCall.Instance.IsLocal || __cid.isLocal)
{
//继续执行
}
else
{
args.FlowBehavior = FlowBehavior.Return;
} }
}

  然后我们在之前的方法上添加:

	  public class LocalTest
{
/// <summary>
/// 添加一个消息
/// </summary>
[Proxy]
public static void AddMessage(string topic, string messageBody)
{
//这里什么都不干
}
}

  生成后反编译

public class LocalTest
{
public static void AddMessage(string topic, string messageBody)
{
MethodExecutionArgs methodExecutionArgs = new MethodExecutionArgs(null, new Arguments<string, string>
{
Arg0 = topic,
Arg1 = messageBody
});
MethodExecutionArgs arg_25_0 = methodExecutionArgs;
MethodBase = <>z__a_3._2;
arg_25_0.Method = ;
<>z__a_3.a2.OnEntry(methodExecutionArgs);
if (methodExecutionArgs.FlowBehavior != FlowBehavior.Return)
{
try
{
<>z__a_3.a2.OnSuccess(methodExecutionArgs);
}
catch (Exception exception)
{
methodExecutionArgs.Exception = exception;
<>z__a_3.a2.OnException(methodExecutionArgs);
switch (methodExecutionArgs.FlowBehavior)
{
case FlowBehavior.Default:
case FlowBehavior.RethrowException:
IL_81:
throw;
case FlowBehavior.Continue:
methodExecutionArgs.Exception = null;
return;
case FlowBehavior.Return:
methodExecutionArgs.Exception = null;
return;
case FlowBehavior.ThrowException:
throw methodExecutionArgs.Exception;
}
goto IL_81;
}
}
}
}

  

帮我们正确的填写了缺失的部分。

优点:
简便,自动化,并且不需要去修改成代理类。
商业版,稳定性良好。
在VS中集成

缺点:
商业化,如果上线保险点还是去买一个。
Unity中,调试有点Bug,Pdb貌似有bug,兼容性问题。
如果不想用DLL,需要一些特殊手法才能在Unity中使用。

PS:不喜欢用商业产品,推荐用Fody,也有实现,回头有可能会切换到那个版本去。

游戏编程系列[1]--游戏编程中RPC协议的使用[2]--Aop PostSharp篇的更多相关文章

  1. WCF编程系列(六)以编程方式配置终结点

    WCF编程系列(六)以编程方式配置终结点   示例一中我们的宿主程序非常简单:只是简单的实例化了一个ServiceHost对象,然后调用open方法来启动服务.而关于终结点的配置我们都是通过配置文件来 ...

  2. Java并发编程系列-(1) 并发编程基础

    1.并发编程基础 1.1 基本概念 CPU核心与线程数关系 Java中通过多线程的手段来实现并发,对于单处理器机器上来讲,宏观上的多线程并行执行是通过CPU的调度来实现的,微观上CPU在某个时刻只会运 ...

  3. 游戏编程系列[1]--游戏编程中RPC协议的使用

    RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在 ...

  4. 学习ASP.NET Core Blazor编程系列十——路由(中)

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  5. 游戏编程系列[2]--游戏编程中RPC与OpLog协议的结合--序

    在系列[1]中,我们展示了RPC调用协议的定义以及演示,通过方法定义以及协议约定,进行了协议约定以及调用过程的约定.然而,实际上在游戏中,调用过程之后,需要传输相对多的数据给服务端. 常用场景,客户端 ...

  6. 游戏编程系列[1]--游戏编程中RPC协议的使用[3]--体验

    运行环境,客户端一般编译为.Net 3.5 Unity兼容,服务端因为用了一些库,所以一般为4.0 或往上.同一份代码,建立拥有2个项目.客户端引用: WindNet.Client服务端引用: OpL ...

  7. python编程系列---Pycharm快捷键(更新中....)

    以下是我常用到的Pycharm快捷键(还有很多,只是我暂时用的最多的就这些): 在开发过程中,经常使用一些快捷键会大大提高开发效率,不要因为看这多而不用,常用的就那些,用得多就都记住了,脱离鼠标,逼格 ...

  8. Hadoop中RPC协议小例子报错java.lang.reflect.UndeclaredThrowableException解决方法

    最近在学习传智播客吴超老师的Hadoop视频,里面他在讲解RPC通信原理的过程中给了一个RPC的小例子,但是自己编写的过程中遇到一个小错误,整理如下: log4j:WARN No appenders ...

  9. Java并发编程系列-(9) JDK 8/9/10中的并发

    9.1 CompletableFuture CompletableFuture是JDK 8中引入的工具类,实现了Future接口,对以往的FutureTask的功能进行了增强. 手动设置完成状态 Co ...

随机推荐

  1. 初识Hadoop、Hive

    2016.10.13 20:28 很久没有写随笔了,自打小宝出生后就没有写过新的文章.数次来到博客园,想开始新的学习历程,总是被各种琐事中断.一方面确实是最近的项目工作比较忙,各个集群频繁地上线加多版 ...

  2. 图片访问实时处理的实现(nodejs和php)

    我在访问时光网.网易云音乐等网站时,发现将它们页面中的一些图片URL修改一下就可以得到不同尺寸的图片,于是思考了其实现方案,我的思路是:URL Rewrite + 实时处理 + 缓存,对用户请求的UR ...

  3. SDWebImage源码解读之SDWebImageDownloaderOperation

    第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...

  4. 一步步开发自己的博客 .NET版(11、Web.config文件的读取和修改)

    Web.config的读取 对于Web.config的读取大家都很属性了.平时我们用得比较多的就是appSettings节点下配置.如: 我们对应的代码是: = ConfigurationManage ...

  5. 小白解决CENTOS7错误:Cannot find a valid baseurl for repo: base/7/x86_6

    刚入手的MacBook想着学点东西,本汪还是决定玩玩CentOS服务器,安装好了VirtualBox + CentOS. 打开一看,懵逼了!命令行! 行吧,先装个图形界面: $sudo yum gro ...

  6. JavaScript权威指南 - 对象

    JavaScript对象可以看作是属性的无序集合,每个属性就是一个键值对,可增可删. JavaScript中的所有事物都是对象:字符串.数字.数组.日期,等等. JavaScript对象除了可以保持自 ...

  7. 如何在ASP.Net创建各种3D图表

    我们都知道,图表在ASP.NET技术中是一种特别受欢迎而又很重要的工具.图表是表示数据的图形,一般含有X和Y两个坐标轴.我们可以用折线,柱状,块状来表示数据.通过图表控件,我们即能表示数据又能比较各种 ...

  8. 在Linux系统下运行微信Web开发者工具

    微信Web开发者工具只有window版本和mac版本,如果想要在Linux系统下运行微信Web开发者工具,需要花费很大周折. 注:带 * 的步骤或文件为不确定是否管用的步骤或文件.本人系统为Linux ...

  9. JAVA 设计模式之策略模式

    定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 类型:行为类模式 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换.在前面说过 ...

  10. Oracle 10g安装教程

    首先下载安装文件,打开后文件结构如图所示: 安装之前请关闭Windows防火墙并断开网络. xp系统下直接双击运行(本经验以XP系统安装为例进行讲述). 如果是在win7上安装,如图:在setup文件 ...