欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 »  .NET本质论第一卷:公共语言运行库教程 » 正文

本教程章节列表

.net本质论-方法的调用与消息

创建时间:2013年02月21日 22:05  阅读次数:(4787)
分享到:
方法调用的参数可通过刚才演示的IMethodMessago.GetArg得到。此外,CLR还定义了两个与请求和响应消息相关的强类型接口(strongly typed interface):


注意,响应消息(IMthodReturnMessage)不仅有查询输出参数的方法,还提供了ReturnValue属性,通过它访问类型化返同值。图7.3展示了这两个接口和调用方法之间的关系。

尤其要注意的是,在消息层面上,导致异常终止的方法调用只是产生一个不同的响应消息。不管正常终止还是异常终止,都将有一个消息传送调用的结果。小过,导致异常终止的方法调用不会存在有救的ReturnValue属性。更进一步地说,表明错误状况的异常对象可以通过Exception属性访问。
方法的调用与消息

在消息处理过程中的某一点,我们需要将请求消息转换成响应消息。为此,CLR专门提供了一个具体类,System.Runtime.Remoting.Messaqing.ReturnMessage。ReturnMessage类实现了IMethodReturnMessage接口并支持两个构造函数:一个用于表示止常终止,另一个用于表示异常终止。
Namespace System.Reutntime.Remoting.Messaging{
Public class ReturnMessage:ImethodReturnMessage,ImethodMessage ,Imessage{
//正常终止的构造函数
Public ReturnMessage(object returnValue,object[] outArgs,int outArgCount,LogicalCallContext.calaCtx,ImethodCallMessage return);
//异常终止的构造函数
Public ReturnMessage(System.Exception ex,ImethodCallMessage request);
//为了清晰起见,余下部分省略
}
}

注意,这两个构造函数都接收一个请求消息,并将其作为最终的参数,这允许ReturnMessage对象还原正在被调用的方法的元数据。

为了讨论这一点,下面给出—个例子。首先,考虑下面的简单接口:
Pubic interface Icalculator{
Double Add(double x,double y);
Double Multlply(double x,double y);
}

归根结底,这些方法定义中的每一个都对应一个潜在的消息交换。不妨设想一下.CLR提供一种方式将堆栈帧编码到一个请求消息中。对于这个给定的基于CLR的管道片断,下面的代码将是该接口的一个合理实现:
Public static ImethodReturnMessage
processMessage(ImethodCallMessage return){
switch(request.MethodName)
{
Case “Add”{
Double x=(double)request.GetInArg(0) ;
Double y=(double)request.GetInArg(1) ;
Double result=x+y ;
Return new ReturnMessage(result,null,0,null,request);
}
Case “Multiply”:
{
Double x=(double)request.GetInArg(0) ;
Double y=(double)request.GetInArg(1) ; 
Double result=x*y ;
Return new ReturnMessage(result,null,0,null,request);
}
Default:{
String exm=String.Format{“{0} not implemented”,request.MethodName};
Exception ex=new NotImplementedException(exm);
Return new ReturnMessage(ex,request);
}
}
}

注意,switch语句的前两个分支从请求消息中提取了输入参数,并将它们缓存到局部变量中。在得知方法的结果后,CLR构造一个新的ReturnMessage对象,并将类型化返回值作为第一个构造函数参数进行传递。在switch语句的第三个分支中,通过使用ReturnMessage构造函数标明方法的异常终止,该函数接收System.Exception作为它的第一个参数。

如果处理代码返回一个包含异常的有效消息,则表明处理了这条消息。更进步讲,该处理正确地产生了一个异常作为结果。如果处理消息发生了问题,那么,处理代码显式地抛出一个异常比较合理,因为处理过程将不能发生。

尽管没有目标对象消息也能够被处理,但消息部件的最终用途是将调用转发到实际对象上。这将在下一节详细描述。
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf】

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 24+40=? 的结果(结果是:64)
结  果: