JGTM'2004 [MVP] 对MarshalByRefObject的讲解

深入解析 C# 中的 MarshalByRefObject MarshalByRefObject是.NET 框架中的一个基类,位于System命名空间下。当一个类继承自MarshalByRefObject时,它就获得了跨应用域进行远程调用的能力。与普通对象不同,普通对象在内存中是以值传递的方式进行操作,即在传递对象时,会复制对象的实际内容;而继承自MarshalByRefObject的对象是以引用传递的方式工作,传递的是对象的引用而非对象本身的副本。​MarshalByRefObject是 C# 中用于实现跨应用域和进程通信的强大工具。 阅读详情

问:

打扰一下,请问MarshalByRefObject中的"Marshal"应该怎样理解?

 

回复:

按照package的意思理解——当一个对象需要长途跋涉到另一个环境中时,需要将其marshal成一个可以传输的形态(比如在.NET Remoting中对象将被打包成一个serializable的ObjRef实例——这个ByRef就是指ObjRef这种形态);同理,当打包以后传输到目标地点,还要执行unmarshal的操作将其还原为内存中的对象。:)

 

问:

谢谢!

MarshalByRefObject是不是可以这样理解:对被引用的对象进行Marshal。如果按照package的意思理解,那package的过程是怎样的?

 

MSDN上这样讲:

MarshalByRefObject 是通过使用代理交换消息来跨应用程序域边界进行通讯的对象的基类.

MarshalByRefObject 对象在本地应用程序域的边界内可直接访问。远程应用程序域中的应用程序首次访问MarshalByRefObject 时,会向该远程应用程序传递代理。对该代理后面的调用将封送回驻留在本地应用程序域中的对象。

 

在Marshal中,上面所说的代理是什么?有什么用?

 

MSDN上还讲到:

当跨应用程序域边界使用类型时,类型必须是从 MarshalByRefObject 继承的,而且由于对象的成员在创建它们的应用程序域之外无法使用,所以不得复制对象的状态。

 

既然对象的状态不能传递过去,那传递这个对象又有何意义?

第一次去理解MarshalByRefObject,有的问题可能提的比较肤浅,请您指点。

 

回复:

MarshalByRefObject是所有可以在AppDomain边界外部访问的对象的基类,重心不是marshal,而是object,即object that could be marshaled by reference,也就是可以通过Ref(实际上是ObjRef对象)的机制进行“封送”(MSDN中文版对marshal一词的翻译)的对象。封送的行为是由代理来做的,这里说的代理就是我文章中讲过的.NET Remoting的真实代理(即RemotingProxy)。真实代理不是有一个Invoke()方法吗?当你透过对一个MBRO的透明代理访问该对象的方法时,透明代理将把基于堆栈的方法调用转换为方法调用消息(IMethodCallMessage)并转发给真实代理(在Remoting的场合中也即RemotingProxy),而RemotingProxy的任务就是把对象封送并连同方法调用消息一起转发给远程应用程序域;到达目的地以后的操作类似:远程应用程序域中的监听方当收到发来的方法调用消息时,先取出封送好的ObjRef(这个对象里面保存着发来调用的那个对象!),将其结封(unmarshal)为本地的对象,并获得其透明代理,然后就可以把方法调用消息在转换回基于堆栈的调用发送给这个对象。

 

对象是在本地维护的,但是方法可以在远程调用。你比如说一个web应用程序,你是通过本地的浏览器远程访问这个应用程序,但是应用程序的状态不会由你的浏览器负责(所以你只是在访问这个应用程序提供给你的功能而已,你并没于拥有应用程序本身,包括其所有数据),你只是发送一个个的请求,服务器告诉你处理的结果。在Remoting中 也是一样,当你获得一个远程对象的时候,你实际上只拥有对这个对象的一个远程引用,虽然你可以调用它的方法,但实际上这些操作都是发生在远程的(就是前面 讲过的过程),你只是传入了一些参数,得到了一个结果,但对象的状态还是在远程维护的(换句话说,对象本身也就是对象的所有状态并没有被往返传递,传递的 只是传入传出的参数——当然,如果参数是一个MBRO的话,还是传递对象被封送的引用)。 

也许应该给你准备一个好理解的例子……你就会豁然开朗了。:)

 

问:

我这样的理解对不对?

一般的对象与从MarshalByRefObject继承的对象区别是:

一般的对象只能在本地应用程序域之内被引用,而MarshalByRefObject对象可以跨越应用程序域边界被引用,甚至被远程引用。

 

回复:

Exactly! 当对象跨出AppDomain边界的时候,实际上只是它的一个引用(ObjRef)。你比如说吧:

 

public class LocalObject {

  public void CallRemoteObject(MarshalByRefObject mbro)   {     Console.WriteLine(mbro.ToString());

  } }

 

当传入一个在本地创建的mbro对象时,ToString()方法是直接发送给对象的;而当mbro是通过Remoting创建的远程对象的话,实际上它只是一个包含有已经marshal好的ObjRef的透明代理,ObjRef里面有什么?对象实例的URI!所以当你调用这个远程对象时,相当于向这个远程端口(tcp://remoteServer/xxxx.rem)发送方法调用消息而已。只不过透明代理隐藏了对象位置的概念,而RemotingProxy真实代理则是实际上处理远程方法调用和对象封送的中枢对象。
保姆级教程:断网环境下用Flexnet服务器搞定SolidWorks 2021安装与破解(附错误5解决方案) 本文提供SolidWorks 2021在断网环境下的企业级部署指南,详细解析Flexnet服务器本地化工作原理,并给出安装与破解的实战方案,特别针对常见的'错误5'问题提供多维度解决方案。适用于需要内网隔离或移动办公的工业设计场景,确保数据安全与授权合规。 阅读详情

相关推荐

linux离线安装nginx

linux离线安装nginx

zhang_130914036的博客 9348

MarshalByRefObject

允许在支持远程处理的应用程序中跨应用程序域边界访问对象。命名空间:System程序集:mscorlib(在 mscorlib.dll 中)语法— [C#][SerializableAttribute] [ComVisibleAttribute(true)] public abstract class MarshalByRefObject应用程序域是一个操作系统进程中一个或多个应用程序所驻留的分区。

花尘谷 1260

hi3519dv500 os04a10输入调试

因该sensor接在soc端的iic6,在驱动中(Hi3519DV500_SDK_V2.0.1.1\smp\a55_linux\source\mpp\cbb\isp\user\sensor\hi3519dv500\omnivision_os04a10\os04a10_sensor_ctl.c)注意总线的选择。mem_process_isolation=1 改为 mem_process_isolation=0。2、OT_MIPI_SET_HS_MODE配置为LANE_DIVIDE_MODE_1。

linus 3170

C#中的MarshalByRefObject

C#的MarshalByRefObject用法

追赶时代的博客 501

S32K3实战:手把手教你用eMIOS模块实现电机PWM控制(附代码)

本文详细解析了NXP S32K3系列MCU的eMIOS模块在电机PWM控制中的应用,从硬件设计到软件实现,再到调试与优化,提供了完整的实战指南。通过eMIOS模块的硬件级PWM生成能力,工程师可以实现高精度的电机控制,适用于汽车电子和工业控制领域。

weixin_42570484的博客 148

【人工智能】Spring AI项目在定义 `response_format` 的 Invalid schema for response_format ‘custom_schema‘

确保。

奶爸的编程之路,也就一周冷个三天 562

两篇文章理解 MarshalByRefObject

Remoting中使用应用程序域概念

快乐小斗车 572

XGBoost原生接口和Sklearn接口参数详解

XGBoost原生接口和Sklearn接口参数详解

算法工程师 2654

引用 C# MarshalByRefObject 和Serializable的区别

<br />这两种方式的类一般都是用于远程传输时使用。<br />marshalbyrefobject是通过引用传递serializable是通过值传递,现在就来分析下什么是引用传递,什么是值传递。<br />理解这个对Remoting或者webservice的认识是很重要的。<br />marshalbyrefobject(引用)本机或者是服务器上的其实都是同一个实例,只不过是服务器创建后你在本地使用了那个对象而已。比如说A类继承了marshalbyrefobject那么A类由服务器创建实例了,客户端都可

乔峰的专栏 1529

3 路由引入

在大型企业网络中,网络规模十分庞大,选用单一的路由协议无法满足网络的需求,因此多种路由协议共存的情况十分常见。或者出于业务逻辑或行政管理的考虑,会在不同的网络结构中设计和部署不同的路由协议,使路由的层次结构更加清晰可控。路由引入是具有方向性的,将路由信息从路由协议A引入到路由协议B(A-to-B),则路由协议B可获知A中的路由信息,但是此时,A还并不知晓B路由协议中的路由信息,除非配置B-to-A的路由引入。表3-1:各种路由协议的优先级。通过路由引入,可以实现路由信息在不同路由协议间传递。

lwljh134的博客 621

化工设计软件:PDMS二次开发_(7).数据导入与导出技术

在某些复杂场景下,PDMS提供的标准API接口可能无法满足需求。此时,可以通过自定义API接口来实现特定的数据导入与导出功能。自定义设备导入API接口可以处理更复杂的设备数据格式。# 导入必要的库import pdms_api # 假设有一个PDMS API库# 定义自定义设备数据# 自定义设备导入API接口# 调用自定义设备导入API接口# 输出导入成功的消息print("自定义设备数据导入成功")在PDMS二次开发中,数据的导入与导出是关键的技术环节。

kkchenjj的博客 1486

[转]JGTM'2004 [MVP] 对MarshalByRefObject的讲解

问: 打扰一下,请问MarshalByRefObject中的"Marshal"应该怎样理解? 回复: 按照package的意思理解——当一个对象需要长途跋涉到另一个环境中时,需要将其marshal成一个可以传输的形态(比如在.NET Remoting中对象将被打包成一个serializable的ObjRef实例——这个ByRef就是指ObjRef这种形态);同理,当打包...

weixin_34290352的博客 58

修改 Alist 密码时报错?看看这个坑怎么解决!

启动服务后,再修改密码”。以后再遇到类似问题,先检查服务是否正常运行,说不定就能少踩不少坑。如果还有其他 Alist 的问题,欢迎在评论区留言交流~

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1155

JGTM'2004 [MVP] 对MarshalByRefObject的讲解 (zz.is2120)

//z 2012-09-11 09:30:29 IS2120@csdn.T2872699816[T30,L404,R7,V203] Anyone can explain the major use of MarshalByRefObject What's the purpose for MarshalByRefObject? 1. Remoting; it means...

122

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

转:JGTM'2004 [MVP] 对MarshalByRefObject的讲解

问: 打扰一下,请问MarshalByRefObject中的"Marshal"应该怎样理解? 回复: 按照package的意思理解——当一个对象需要长途跋涉到另一个环境中时,需要将其marshal成一个可以传输的形态(比如在.NET Remoting中对象将被打包成一个serializable的ObjRef实例——这个ByRef就是指ObjRef这种形态)...

weixin_34006965的博客 119

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

MarshalByRefObject 类

<br />应用程序域是一个操作系统进程中一个或多个应用程序所驻留的分区。同一应用程序域中的对象可以直接通信。不同应用程序域中的对象的通信方式有两种:一种是跨应用程序域边界传输对象副本,一种是使用代理交换消息。MarshalByRefObject 是通过使用代理交换消息来跨应用程序域边界进行通信的对象的基类。MarshalByRefObject 对象在本地应用程序域的边界内可直接访问。远程应用程序域中的应用程序首次访问 MarshalByRefObject 时,会向该远程应用程序传递代理。对该代理后面的调用

anguswdm的专栏 616

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C# 使用MarshalByRefObject跨程序调用方法

MarshalByRefObject 是通过使用代理交换消息来跨应用程序域边界进行通信的对象的基类。不是从 MarshalByRefObject 继承的对象根据值隐式封送。当远程应用程序引用根据值封送的对象时,将跨应用程序域边界传递该对象的副本。===================//程序1和程序2的共有类using System;using System.Collections.Generic

Rocky的博客 3015

.net remoting学习(2)---MarshalByRefObject与对象激活

        通过上一篇的介绍,我想大家对.net remoting的作用也有一个基本的认识了。这一篇,我们主要来讨论两个问题: 1. MarshalByRefObject的介绍 2. .Net Remoting中的两种远程对象激活方式,他们的应用以及区别 MarshalByRefObject对象介绍        先来看看官方的解释吧: 应用程序域是一个操作系统进程中一个...

weixin_34388207的博客 294

MarshalByRefObjects远程对象及其调用方法

A Short Description to MarshalByRefObjects Remote Object and Invocation Tips   A MarshalByRefObject is a remote object that runs on the server and accepts methods calls from the client. Its data is ...

weixin_33885676的博客 295
上一篇: 隐藏窗体的关闭键
下一篇: 利用消息机制实现.NET AOP(面向方面编程)--通过RealProxy实现
first_fish
博客等级 码龄21年 1粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值