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真实代理则是实际上处理远程方法调用和对象封送的中枢对象。
VTK GPU 加速渲染技术 / 创建颜色工具// 创建立方体数据// 创建OpenGL映射器(注意使用vtkOpenGLPolyDataMapper而不是常规的vtkPolyDataMapper)// 启用VBO(顶点缓冲对象)// 声明几何体是静态的以获得最佳性能// 创建actor// 创建渲染器、渲染窗口和交互器renderWindow->SetWindowName("VTK自定义着色器示例");// 添加actor到渲染器。 阅读详情

相关推荐

从理论到实践:笛卡尔空间阻抗控制的实现挑战与变体解析

本文深入探讨了笛卡尔空间阻抗控制的核心原理、工程实现中的五大挑战及经典变体实战解析。通过详细的数学建模和实际案例分析,揭示了阻抗控制在工业机器人、医疗设备等领域的应用价值,特别是在力感知精度、动力学模型校准和实时计算等方面的关键技术突破。

weixin_30952535的博客 449

MarshalByRefObject

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

花尘谷 1260

MCGS 和 200SMART 时间同步

在实际应用中,PLC经常会因为断电原因,导致时间不准确。假设我们设置了一个投加泵,每天8-18点投加。屏幕上显示的时间和PLC内部的时间,很可能不一样。所以需要在触摸屏上读取PLC的时间,并且提供设置功能。

mmxxoo_xxmmp的博客 1521

C#中的MarshalByRefObject

C#的MarshalByRefObject用法

追赶时代的博客 501

人工智能训练师技能等级认定四级技能考核试卷-样题1

本文为人工智能训练师四级技能考核试卷,包含六个实操考核项目,总分100分,考试时间150分钟。试卷涵盖数据处理、模型训练准备及系统维护等核心技能:1)垃圾分类数据集规范与处理(30分),要求评估数据格式并编写Python处理代码;2)学生成绩数据集分析(20分),涉及数据预处理、可视化及相关性分析;3)数据标注审核(10分),重点审核标注准确性;4)智能数据服务系统维护与优化(40分),包括安全帽数据集的项目创建、数据处理及平台协作。考核强调Python编程、数据处理平台操作及AI工作流程的实践能力。

weixin_42221934的博客 440

RFSOC实战解析:MTS多片同步的时序校准与相位相干实现

本文深入解析了在RFSOC平台上实现MTS多片同步的关键技术与实战流程。文章从相位相干的重要性出发,详细阐述了SYSREF与SYNC信号的协同工作机制,并提供了从硬件时钟配置到软件API调用的完整MTS实现步骤。重点探讨了时序校准的核心方法,旨在帮助工程师解决多通道系统相位不一致的难题,确保ADC与DAC达到精确的相位相干,从而构建高性能的MIMO和相控阵系统。

weixin_29206669的博客 193

两篇文章理解 MarshalByRefObject

Remoting中使用应用程序域概念

快乐小斗车 572

(三)UPF之Domain Coverage Relationship(Cover、Equivalent、Independent)

整个Soc架构中一般会存在多个Power Domain,不同的Power Domain之间也存在着一定的Coverage关系。在Cadence工具中,这种。不同的Domain Coverage关系中,各个Domain存在着一定的关联()。

Mr.翟的博客 1424

引用 C# MarshalByRefObject 和Serializable的区别

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

乔峰的专栏 1529

OpenCV 基于上升距离计算边缘清晰度

OpenCV 基于上升距离计算边缘清晰度

dayuhaitang1的博客 254

【YOLOv8全方位学习手册】第四章 数据增强:从扩充数据到塑造模型的认知边界

"""使用 Albumentations 做自定义增强,兼容 YOLO 格式"""])# 转成 numpy# boxes 必须是 [[x_min,y_min,x_max,y_max], ...]# 在数据加载时调用你可以把集成到 PyTorch 的 Dataset 类里,或使用 Ultralytics 自带的DataLoader。

VectorShift的博客 211

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

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

weixin_34290352的博客 58

电子凸轮追剪算法深度解析:2500字图解+代码实战

工艺需求:在物料连续运动过程中完成精准切割核心矛盾:切割瞬间刀具与物料必须绝对同步传统方案:机械凸轮(结构复杂,调整困难)现代方案:电子凸轮(柔性可调,精度更高)

QQ_778132974的博客 1112

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

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

weixin_34006965的博客 119

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

MarshalByRefObject 类

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

anguswdm的专栏 616

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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、付费专栏及课程。

余额充值