远程处理Remoting
日程
?应用程序域
?Remoting和原理
?编程式和管理式配置实例
用应用程序域
操作系统和运行库环境通常会在应用程序间提供某种形式的隔离。例如,Microsoft Windows 使用进程来隔离应用程序。为确保在一个应用程序中运行的代码不会对其他不相关的应用程序产生不良影响,这种隔离是必需的。
用应用程序域优点
1.在一个应用程序中出现的错误不会影响其他应用程序。因为类型安全的代码不会导致内存错误,所以使用应用程序域可以确保在一个域中运行的代码不会影响进程中的其他应用程序。
2.能够在不停止整个进程的情况下停止单个应用程序。使用应用程序域使您可以卸载在单个应用程序中运行的代码。
3.在一个应用程序中运行的代码不能直接访问其他应用程序中的代码或资源。为了强制实施此隔离,公共语言运行库禁止在不同应用程序域中的对象之间进行直接调用。要在各域之间传递对象,可以复制这些对象,或通过代理访问这些对象。如果复制对象,那么对该对象的调用为本地调用。也就是说,调用方和被引用的对象位于同一应用程序域中。如果通过代理访问对象,那么对该对象的调用为远程调用。在此情况下,调用方和被引用的对象位于不同的应用程序域中。域间调用所采用的远程调用基础结构与两个进程间的调用或两台计算机间的调用的基础结构相同。因此,被引用的对象的元数据必须对于两个应用程序域均可用,以便用 JIT 正确编译该方法调用。如果调用域对被调用对象的元数据没有访问权,则编译可能失败,并引发类型为 System.IO.FileNotFound 的异常。
4.代码行为的作用范围由它运行所在的应用程序决定。换言之,应用程序域将提供应用程序版本策略等配置设置、它所访问的任意远程程序集的位置,以及加载到该域中的程序集的位置信息。
5.向代码授予的权限可以由代码运行所在的应用程序域来控制。
CLR与应用程序域中
.net CLR本身是一套采用非托管C++实现的Windows动态链接库。这些动态链接库提供了托管理堆、垃圾回收器、即时编译器、程序集解析器和加载器及其托管代码需要的其他元给。应用程序域的作用就是使它加载的程序集能够访问这些服务,事实上,这就是应用程序域连接托管世界的秘诀。然而有一点很重要:同一进程的所有应用程序域共享同一托管堆。
应用程序域类
AppDomain表示应用程序域,它是一个应用程序在其中执行的独立环境。
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
Console.Read();
当需要应用程序域时,公共语言运行库宿主会自动创建它们。不过,您可以创建自己的应用程序域并将它们加载到需要亲自管理的程序集中。您也可以创建从中执行代码的应用程序域。
创建应用程序域中
AppDomain domain = AppDomain.CreateDomain(“mydomain"); Console.WriteLine("Host domain: " + AppDomain.CurrentDomain.FriendlyName); Console.WriteLine("child domain: " + domain.FriendlyName);
卸载应用程序域
AppDomain.Unload(domain)
Remoting
利用 .NET 远程处理,可以方便地生成广泛分布的应用程序,而不论应用程序组件是全部集中在一台计算机上,还是分布在世界各地。生成的客户端应用程序可以使用同一台计算机(或可通过其网络连接到的任何其他计算机)上其他进程中的对象。您还可以在同一进程中使用 .NET 远程处理与其他应用程序域进行通信。
.NET 远程处理为进程间通信提供了一种抽象方法,它能够将可远程处理的对象从特定的客户端或服务器应用程序域以及特定的通信机制中分离出来。因此,它可以灵活、轻松地进行自定义。您可以用一种通信协议来替换另一种通信协议,或用一种序列化格式来替换另一种序列化格式,而不用重新编译客户端或服务器。此外,远程处理系统假定没有特殊的应用程序模型。您可以从 Web 应用程序、控制台应用程序、Windows 服务等您要使用的几乎任何应用程序进行通信。远程处理服务器还可以是任意类型的应用程序域。任何应用程序都可以承载远程处理对象,进而为其计算机或网络上的任何客户端提供服务。
若要使用 .NET 远程处理生成一个应用程序,并让其中两个组件直接跨应用程序域边界进行通信,只需要生成以下内容:
1.一个可远程处理的对象。
2.一个服务端应用程序域用(也叫宿主应用程序域中),于侦听针对该对象的请求。
3.一个客户端应用程序域,用于发出针对该对象的请求。
由于客户端和服务端不一定在一个程序域或不一定在同一台机器上,所以客户端调用远程对象就成为问题。客户端在不同应用程序域调用对象时使用代理连接到远程对象。代理是一个提供了和真实对象完全一样的接口、公共方法、属性等成员的对象。在运行过程中,.NET Remoting基于对象元数据生成代理。代理只提供接口,不提供对象的状态,因为对象的真正状态在宿主应用程序域中存储。代理在这里只转发调用。转发调用到一个对象叫封送处理。封送处理的目标是让客户端调用服务端时感觉不到是在与远端对象交流,而是与本地对象在交流。
如果通过代理来访问对象,该对象必需是从 MarshalByRefObject抽象类派生。
宿主应用程序域中
.net将包含服务器对象的应用程序域称为宿主应用程序域。要成为一个宿主,应用程序域必须在.net中注册自己,让.net知道宿主可以接受那些对象的远程调用,以怎样的方式调用。宿主必须在客户端调用前运行。
客户端在编译时,需要远程对象,因为只需要对象内类型成员列表的元数据,不需要IL代码,用远程对象成员来完成远程对象的调用。宿主是需要远程对象的全部数据的,因为不但要调用还要维护对象内部数据的状态。
远程对象类型
.net对于跨域边界访问提供了两种选择:
1.按值封送
2.按引用封送
按值封送
就是把一个对象序死到一个流,然后在远程应用程序域反序列化成对象。
按引用封送
采用引用封送时,客户羰通过一个代理来访问远程对象,代理会转发所有的调用给实际对象。为了指明一个对象是引用封送,类必须派生自MarshalByRefObject,这个类派生的对象始终和创建它的应用程序域绑定,永不脱离该域。
引用封送
客户端激活
服务器端激活
Single-Call
Singleton
激活方式
客户端激活:为每个客户端在宿主上创建一个新对象,并且这个对象会一直在宿主上存在,不被垃圾回收器回收。
Single-Call激活:当客户端使用一个服务器激活Single-Call对象时,.net为每个方法调用创建一个新地象,让其为调用服务,然后销毁。
Single-Call工作步骤:
1.对象代表远程客户端执行一个方法调用
2.当方法调用返回时,如果对象实现了IDisposable接口,.net调用对象的IDisposable.Dispose()。.net释放所有对该对象的引用,让其准备被垃圾回收。其间,客户端继续持有指向代理的一个引用,但是它不知道真的对象其实已经被销毁了。
3.客户端在代理上进行另一个调用。
4.代理转发调用到远程服务器。
5..net创建一个对象并且调用其方法。
●
Singleton激活:为所有客户端提供了一个单一的,共知的对象。当第一个客户端试图访问时,Singleton被创建。后续客户端创建的新对象的调用和后结的访问都跑旱船引导到同一个Singleton对象。
Remoting架构
编程式信道注册-客户端激活
远程对象
public class MyClass:MarshalByRefObject
{
public MyClass()
{
string con = "时间:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "远程对象构造函数被调用。";
File.AppendAllText(@"F:/a.txt", con + "\r\n");
}
public void WriteFile(string content)
{
string con = "时间:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + " 内容:" + content;
File.AppendAllText(@"F:/a.txt", con+"\r\n");
}
}
宿主
using RemoteServer;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Channels.Ipc;
using System.Runtime.Remoting;
private void ServerHostDialog_Load(object sender, EventArgs e)
{
IChannel tcpChannel = new TcpChannel(12345);
ChannelServices.RegisterChannel(tcpChannel,false);
IChannel httpChannel = new HttpChannel(45678);
ChannelServices.RegisterChannel(httpChannel,false );
IChannel ipcChannel = new IpcChannel("MyIPC");
ChannelServices.RegisterChannel(ipcChannel,true );
}
private void button1_Click(object sender, EventArgs e)
{
Type serverType = typeof(MyClass);
RemotingConfiguration.RegisterActivatedServiceType(serverType);
}
客户端
using RemoteServer;
using System.Runtime.Remoting;
private void button1_Click(object sender, EventArgs e)
{
MyClass obj= new MyClass();
obj.WriteFile("名柄为"+this.Handle .ToString ());
}
Type serverType = typeof(MyClass);
private void Form1_Load(object sender, EventArgs e)
{
RemotingConfiguration.RegisterActivatedClientType(serverType, “tcp://localhost:12345”);//第二个参数可换成: http://localhost:45678或ipc://MyIPC
}
编程式信道注册-Single Call激活
远程对象不变
宿主
using RemoteServer;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Channels.Ipc;
using System.Runtime.Remoting;
private void ServerHostDialog_Load(object sender, EventArgs e)
{
IChannel tcpChannel = new TcpChannel(12345);
ChannelServices.RegisterChannel(tcpChannel,false);
IChannel httpChannel = new HttpChannel(45678);
ChannelServices.RegisterChannel(httpChannel,false );
IChannel ipcChannel = new IpcChannel("MyIPC");
ChannelServices.RegisterChannel(ipcChannel,true );
}
private void button1_Click(object sender, EventArgs e)
{
Type serverType = typeof(MyClass); RemotingConfiguration.RegisterWellKnownServiceType(serverType,“RemoteServer”, WellKnownObjectMode.SingleCall);//RemoteServer为远程对象的名称空间
}
客户端
using RemoteServer;
using System.Runtime.Remoting;
private void button1_Click(object sender, EventArgs e)
{
MyClass obj= new MyClass();
obj.WriteFile("名柄为"+this.Handle .ToString ());
}
Type serverType = typeof(MyClass);
private void Form1_Load(object sender, EventArgs e)
{
RemotingConfiguration.RegisterWellKnownClientType(serverType, "tcp://localhost:12345/RemoteServer");
//第二个参数可换成: http://localhost:45678/RemoteServer或ipc://MyIPC/RemoteServer
}
编程式信道注册-Singleton激活
远程对象不变
宿主
using RemoteServer;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Channels.Ipc;
using System.Runtime.Remoting;
private void ServerHostDialog_Load(object sender, EventArgs e)
{
IChannel tcpChannel = new TcpChannel(12345);
ChannelServices.RegisterChannel(tcpChannel,false);
IChannel httpChannel = new HttpChannel(45678);
ChannelServices.RegisterChannel(httpChannel,false );
IChannel ipcChannel = new IpcChannel("MyIPC");
ChannelServices.RegisterChannel(ipcChannel,true );
}
private void button1_Click(object sender, EventArgs e)
{
Type serverType = typeof(MyClass); RemotingConfiguration.RegisterWellKnownServiceType(serverType,“RemoteServer”, WellKnownObjectMode. Singleton);//RemoteServer为远程对象的名称空间
}
客户端
using RemoteServer;
using System.Runtime.Remoting;
private void button1_Click(object sender, EventArgs e)
{
MyClass obj= new MyClass();
obj.WriteFile("名柄为"+this.Handle .ToString ());
}
Type serverType = typeof(MyClass);
private void Form1_Load(object sender, EventArgs e)
{
RemotingConfiguration.RegisterWellKnownClientType(serverType, "tcp://localhost:12345/RemoteServer");
//第二个参数可换成: http://localhost:45678/RemoteServer或ipc://MyIPC/RemoteServer
}
管理式配置
依照上面的例子,远程对象不变,只用在宿主端和客户端的项目中添加“应用程序配置文件”(App.config)文件。
配置文件保存后的名称为:应用程序名.exe.config
比如宿主的配置文件名为RemoteServerHost.exe.config
客户商配置文件名为Client.exe.config
在宿主中和客户端,读取配置文件
在Main函数中
using System.Runtime.Remoting;
[STAThread]
static void Main()
{
RemotingConfiguration.Configure(AppDomain.CurrentDomain.FriendlyName + ".config",false);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
远程对象依然不变
宿主端配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting >
<application>
<service>
<!--<activated type="RemoteServer.MyClass,RemoteServer"></activated>-->
<!--<wellknown type="RemoteServer.MyClass,RemoteServer" mode="Singleton" objectUri="RemoteServer"></wellknown>-->
<wellknown type="RemoteServer.MyClass,RemoteServer" mode="SingleCall" objectUri="RemoteServer"></wellknown>
</service>
<channels>
<channel ref="tcp" port="8005"></channel>
<channel ref="http" port="8006"></channel>
<channel ref="ipc" portName="MyIPC"></channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>
客户端配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting >
<application>
<!--<client url="tcp://localhost:8005">-->
<!--<activated type="RemoteSrerver.MyClass,ServerAssembly"></activated>-->
<!--</client>-->
<client>
<wellknown type="RemoteServer.MyClass,RemoteServer" url="tcp://localhost:8005/RemoteServer"></wellknown>
</client>
</application>
</system.runtime.remoting>
</configuration>
一句话总结:Remoting就是把对象分开到不同的应用程序域中执行的技术。
本文转自桂素伟51CTO博客,原文链接: http://blog.51cto.com/axzxs/179854,如需转载请自行联系原作者
相关文章:

Datawhale组队学习周报(第002周)
Datawhale组队学习周报(第002周) (一)当下 本周(02月22日~02月28日),我们正在进行5门开源内容的组队学习。一共建立了6个学习群,参与人数1080人。到目前为止,有4门课开…

LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍
LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍 LVS (Linux Virtual Server) LVS(Linux Virtual Server)其实就是针对高可伸缩、高可用网络服务的需求,给出了基于IP层和基于内容请求分发的负载平衡调度解决方法,…

UI设计培训分享:设计当中的颜色运用
参加UI设计培训的同学应该都知道,颜色的搭配是学习UI设计非常重要的一步,颜色跟其他的东西一样,适量才会运用得当,如果在你的配色计划中坚持使用马克思三原色的话,你会得到更好的配色结果,为一个项目配色时…

《重构-改善既有代码的设计》读书笔记(二)
12、Lazy Class – 冗赘类 对于几乎没有用的类,运用inline class 将其功能移动。去除这些不值得维护的类。 13、Speculative Generality – 夸夸其谈未来性 对于你现在用不到,觉得总有一天会用到的代码,要警惕。用不上的装置总会挡我们的路&a…

css属性选择符的应用
注释:Internet Explorer 7 (以及更高版本)在规定了 !DOCTYPE 的情况下支持属性选择器。IE6 及更低的版本不支持属性选择器。 [title]{color:red;} //为带有 title 属性的所有元素设置样式: [title"website"]{color:r…

【青少年编程】【答疑】控制Scratch异步代码的执行顺序
问题 几天前,我写了一篇图文 对「等待(0)秒」的理解,发现可以利用「等待(0)秒」这个积木块来解决Scratch中异步代码的执行顺序问题,即点击绿旗后可以控制多个角色中响应该事件的代码的顺序。 …

UI设计培训分享:学习UI设计有哪些技巧
互联网时代的快速发展,UI设计这个行业在互联网有着一席之地,越来越多的人都想要参加UI设计培训班学习,那么对于初学者来说,学习UI设计有哪些技巧呢?来看看下面的详细介绍吧。 学习UI设计有哪些技巧? 1、基础软件操作 UI设计培训…

07 Scratch等级考试(一级)模拟题
Scratch竞赛交流群已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】,即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料(视频、代码、文档)。 这是第…

遮罩层+软键盘
一.清关里边申请清关 上传图片由于本身就是布局用的图片,微信手机长按会出现保存收藏该图片。 解决方法:添加同级元素充当遮罩层。设置样式,把点击事件从设置的上传图片中移除即可。 1)<!-- 图片遮罩层 --> <…

UI培训技术分享:设计大神都在用的10种技法!
越来越多的人开始学习UI设计,想要进群到UI设计这个行业,本期小编为大家介绍的UI培训教程就是关于设计师会经常用到的一些技巧,帮助大家后期的工作中的应用。 UI培训技术分享:设计大神都在用的10种技法! 1.将图片融入背景来使用 同…

正则表达式限制输入整数或小数
string pattern "^\d{1,7}(?:\.\d{0,2}$|$)"; //这是一个格式匹配字符串 其中的含义可以参考http://hi.baidu.com/%D6%C2%D0%F9%B8%F3/blog/item/9060fe35f84f872370cf6c83.html。如果调用以下代码,可以匹配整数位最多为7位,小数位最多为2位…

QC配置邮件服务器(Mail Dir)
http://blog.sina.com.cn/s/blog_5007d1b10100m8cm.html 本文转自hblxp32151CTO博客,原文链接:http://blog.51cto.com/starpoint/584056,如需转载请自行联系原作者

Datawhale组队学习周报(第003周)
(一)当下 本周(03月01日~03月07日),我们组织的5门组队学习的课程中有3门已经结营,2门仍在进行中。 1. CV实践-布匹疵点智能识别(异常检测) 已经结营,优秀队长与优秀学…

软件测试培训分享:如何才能选择到靠谱的培训学校
软件测试这个行业在近几年是非常的吃香的,职业需求也是非常大的,很多小伙伴都想寻找一个合适的软件测试培训机构进行系统学习,那么如何才能选择到靠谱的培训学校呢?来看看下面的详细介绍。 如何才能选择到靠谱的软件测试培训学校?一般可从以…

《统一沟通-微软-实战》-5-部署-SharePoint Server 2010
1. 登录-SP2010 2. 查看-计算机名 3. 查看-IP 4. 加域 5. 上网 安装 SharePoint Server 2010 若要安装和配置 SharePoint Server 2010,请按照以下步骤执行: 1. 运行 Microsoft SharePoint 产品准备工具,该工具安装使用 SharePoint Server 所需…

JQuery 给DOM控件绑定和移除事件的方法
绑定事件: Method 1$("#myElement").click( function() {alert($(this).text());}); Method 2 $("#myElement").bind(click, function() {alert($(this).text());}); 第一种看起来要方便一些,但它有一个局限,即DOM元素必…
【组队学习】【23期】Datawhale集成学习(上)
集成学习(上) 开源内容:https://github.com/datawhalechina/team-learning-data-mining/tree/master/IntegratedLearning 基本信息 贡献人员:李祖贤、薛传雨、赵可、杨毅远、陈琰钰学习周期:14天学习形式࿱…

APP测试和传统软件测试有什么区别?
软件测试从字面意思我们就知道它主要是做软件产品方面的测试,尤其是APP这块,那么很多人就问了APP测试和传统软件测试有什么区别?来看看下面的详细介绍。 软件测试培训分享:APP测试和传统软件测试有什么区别?移动APP的特点使得它与传统软件在…

C6678-SRIO和Virtex6-FPGA
设计的板子到了SRIO调试阶段了,在板子上,一片V6和两片6678通过4XSRIO互联,中间没有Switch,总算搞定了相互之间的通信。首先,感谢Ti论坛提供的SRIO程序范例,但是其硬件平台是EVM板,更多的只能用于…
【组队学习】【23期】Datawhale编程实践(区块链)
编程实践(区块链) 开源内容:https://github.com/datawhalechina/team-learning-program/tree/master/Blockchain 基本信息 贡献人员:陈锴、孙子涵、李岳昆、易远哲学习周期:12天学习形式:根据教程主线进…

bootstrap模态框显示控制
默认模态框弹出后,点击背景蒙层部分弹框会消失,如要解决,需要在模态框属性中加 aria-hidden"true" data-backdrop"static"属性即可; 转载于:https://www.cnblogs.com/jiangze-blog/p/7844639.html

什么是Python?主要运用哪些方面?
人工智能领域少不了Python的相助,这也是目前Python技术在人工领域的好前景所致,近几年,想要学习Python技术的人越来越多,很多人都想知道什么是Python?主要运用哪些方面?来看看下面的详细介绍。 什么是Python?主要运用哪些方面?…

第五课:系统目录及ls·文件类型及alias命令介绍
1、上过一次我们学习了单用户和救援模式及服务器秘钥登录等操作,而我们最终的目的还是要操作和使用linux系统,所以我们今天先初步学习linux的基本命令如下: 一目录介绍 ls命令介绍 文件类型 alias命令介绍 1、首先我们…

jquery 实现表单验证功能代码(简洁)
html xmlns"http://www.w3.org/1999/xhtml"> <head> <title>表单验证页面</title> <link href"../Scripts/themes/default/easyui.css" rel"stylesheet" type"text/css" /> <script src"../Script…
【组队学习】【23期】Datawhale深度推荐模型
深度推荐模型 开源内容:https://github.com/datawhalechina/team-learning-rs/tree/master/DeepRecommendationModel 基本信息 贡献人员:罗如意、吴忠强、田雨,宁彦吉, 何世福、徐何军、赖敏材、刘纪川学习周期:13天…

参加Python培训后能干嘛
参加Python培训后能干嘛?相信这是目前很多正在学习Python技术的同学都比较关注的一个问题,Python的法发展前景是非常好的,那么具体学完之后可以运用到哪些方面呢?我们来看看下面的详细介绍吧。 参加Python培训后能干嘛?网站是很基本的,…

博客园HTML源码运行特制js(原创自Zjmainstay)
canrun 测试运行HTML <html> <head><title>测试博客园HTML源码运行程序</title><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><meta http-equiv"Content-Language" content"zh-CN…
【组队学习】【23期】Datawhale零基础入门数据挖掘(心跳信号分类)
零基础入门数据挖掘(心跳信号分类) 开源内容:https://github.com/datawhalechina/team-learning-data-mining/tree/master/HeartbeatClassification 基本信息 贡献人员:鱼佬、牧小熊、吉米杜、张晋、王皓月、姚昱君学习周期&am…

Unity3D提示“XX,some are mac os x (unix) and some are windows”
2019独角兽企业重金招聘Python工程师标准>>> 解决办法: 将Unity安装目录\Editor\Data\Resources\ScriptTemplates\目录下的所有文件用上面的方式修改换行编码,以后通过Unity3D编辑器创建的文件将默认以“CR LF”换行,一劳永逸。 转…

什么是Python?前景怎么样?
Python在人工智能行业的高速发展,引起了很多人的关注,很多目前都不知道什么是Python?前景怎么样?那么下面小编就为大家做下详细的介绍,希望能够帮助到大家。 什么是Python?前景怎么样? 你可能听说过c语言,听说过java语言&a…