关于MarshalByRefObject的解释

首先了解一下不同应用程序域中的对象的通信方式有两种:

一种是跨应用程序域边界传输对象副本;
一种是使用代理交换消息。

简单来讲,继承此类的对象可以跨越应用程序域边界被引用,甚至被远程引用.

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

你实际上只拥有对这个对象的一个远程引用,虽然你可以调用它的方法,但实际上这些操作都是发生在远程的(就是前面讲过的过程)

别外解释一下WebService,

Web services 使用 XML 来编解码数据,并使用 SOAP(通信协议)来传输数据。大家可以发现WebService代理类的MarshalByRefObject对象的。

remoting 是MarshByReference的,可以传变量的引用,直接对服务器对象操作。速度快,适合intranet(企业内部互联网)。
webservice 是MarshByValue的,必须传对象的值。速度慢,可以过FIREWALL,配置比较简单,适合internet(因特网)。

概括的说Remoting与Web Services的区别是:
(1)既支持TCP信道又支持HTTP信道,传输速度快
(2)即可传输XML的SOAP包又可传输二进制流,效率高
(3)Remoteing主要用于C/S结构项目
(4)不一定要依赖IIS服务器

一般来说,remoting是和平台相关的,需要客户和服务器都是.NET,但可配置特性比较好,可以自定义协议。web service可以做到跨平台通信,但必须采用SOAP协议。

转载于:https://www.cnblogs.com/webfpc/archive/2010/03/10/1667101.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你需要在 .NET Standard 2.0 中使用 Remoting 库,可以按照以下步骤进行: 1. 在 Visual Studio 中创建一个 .NET Standard 2.0 类库项目。 2. 右键点击项目,选择“管理 NuGet 程序包”。 3. 在 NuGet 程序包管理器中搜索“System.Runtime.Remoting”并安装。 4. 在代码中使用 Remoting 相关的命名空间,例如 System.Runtime.Remoting.Channels、System.Runtime.Remoting.Messaging 等。 5. 编写 Remoting 服务端和客户端的代码,分别继承 MarshalByRefObject 类,并实现相应的接口。 以下是一个简单的示例代码: ```csharp // 定义远程接口 public interface IRemoteService { string SayHello(string name); } // 实现远程服务 public class RemoteService : MarshalByRefObject, IRemoteService { public string SayHello(string name) { return "Hello, " + name + "!"; } } // 服务端启动代码 public static void StartServer() { ChannelServices.RegisterChannel(new TcpChannel(1234), false); RemotingConfiguration.RegisterWellKnownServiceType( typeof(RemoteService), "RemoteService", WellKnownObjectMode.Singleton); } // 客户端调用代码 public static void CallServer() { var url = "tcp://localhost:1234/RemoteService"; var remoteService = (IRemoteService)Activator.GetObject(typeof(IRemoteService), url); var result = remoteService.SayHello("world"); Console.WriteLine(result); } ``` 需要注意的是,Remoting 在 .NET Standard 中的支持是有限的,不支持一些高级特性,例如对象激活和远程事件等。此外,Remoting 已经被官方宣布为过时技术,不再被推荐使用。如果需要实现跨平台的远程通信,建议使用更加现代化的技术,例如 gRPC 或 RESTful API。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值