欢迎来到.net学习网

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

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

热门教程

  • DXperience控件使用教程
  • JQuery EasyUI 1.3.6官方API文档中文版
  • 关系数据库基础教程
  • AspxGridView使用教程
  • C#从入门到精通
  • (X)HTML初级教程
  • ASP.NET2.0入门经典(第4版)
  • .NET本质论第一卷:公共语言运行库教程
  • EasyUI开发经验汇总
  • Oracle数据库应用教程
本教程章节列表
  • 1: NET本质论第一卷:公共语言运行库译者序
  • 2: .NET本质论第一卷:公共语言运行库教程目录
  • 3: 第一章:CLR是一个更好的COM
  • 4: 公共语言运行库
  • 5: 编程模型的演进
  • 6: 第二章:组件-模块定义
  • 7: 程序集的定义
  • 8: .net本质论-程序集名字
  • 9: .net本质论-公钥和程序集
  • 10: CLR加载器
  • 11: 将名字解析成位置
  • 12: 版本化的问题
  • 13: 第三章 类型基础
  • 14: 类型和初始化
  • 15: 类型和接口
  • 16: 类型和基类型
  • 17: 第四章:用类型编程-运行时的类型(1)
  • 18: 用类型编程-运行时的类型(2)
  • 19: 用类型编程-运行时的类型(3)
  • 20: .net本质论-用元数编程(1)
  • 21: .net本质论-用元数编程(2)
  • 22: .net本质论-用元数编程(3)
  • 23: 物殊的方法-属性(1)
  • 24: 物殊的方法-属性(2)
  • 25: 元数据和可扩展性
  • 26: .net本质论-元数据与可扩展性(2)
  • 27: .net本质论-元数据与可扩展性(3)
  • 28: .net本质论第五章:实例
  • 29: .net本质论-System.ValueType类型与System.Enum类型
  • 30: 变量、参数和字段
  • 31: C#中值变量与引用变量的区别
  • 32: C#中相等性与同一性的区别
  • 33: 值类型的比较与排序
  • 34: 克隆-浅表副本与深层副本
  • 35: 装箱-将值类型转为引用类型
  • 36: .net本质论-数组的定义与使用
  • 37: 一维数组、多维数组、矩形数组与交错数组
  • 38: 数组的详细使用示例
  • 39: .net的对象生命周期原理
  • 40: 对象生命周期与垃圾回收
  • 41: 程序的终结-Finalize方法与IDisposable接口
  • 42: 资源的自动释放-C#中using的使用
  • 43: .net本质论-第六章:方法
  • 44: .net本质论-方法(二)
  • 45: 方法调用和类型
  • 46: 元数据特性和虚方法virtual,newslot,abstract,final等的应用
  • 47: 接口、虚方法和抽象方法
  • 48: 接口,虚方法和抽象方法(二)
  • 49: 接口方法声明形式
  • 50: .net本质论第六章-显式方法调用
  • 51: .net本质论第六章-显式方法调用(二)
  • 52: 间接方法调用和委托
  • 53: 委托的重载与使用方法
  • 54: 委托的使用方法和示例
  • 55: 异步方法的调用
  • 56: net本质论-异步方法调用(二)
  • 57: CLR锁的使用与监视器
  • 58: 方法的终止与异常处理
  • 59: .net本质论-第七章:高级方法
  • 60: .net本质论-方法的调用与消息
  • 61: 堆栈和消息转化
  • 62: .net本质论-代理的类型
  • 63: .net本质论-代理的类型(二)
  • 64: 消息过程(回顾一)
  • 65: 消息过程(回顾二)
  • 66: 对象和上下文(一)
  • 67: 对象和上下文(二)
  • 68: .net本质论-上下文和截获(一)
  • 69: 消息接收器区域-信使接收器(envoy sink)
  • 70: .net本质论-第八章:域
  • 71: 第八章:域-用AppDomain编程
  • 72: AppDomain事件
  • 73: AppDomain和程序集解析器
  • 74: AppDomain和代码管理
  • 75: AppDomain和对象(回顾)
  • 76: NET本质论第九章-安全性
  • 77: Net本质论第九章-安全性(二)
  • 78: Net本质论第九章-安全性(三)
  • 79: Net本质论安全性-策略
  • 80: .net安全性-安全策略(二)
  • 81: .net安全性-安全策略(三)
  • 82: .net安全性-权限策略(一)
  • 83: .net安全性-合并的权限集
  • 84: .net中安全策略的实施(一)
  • 85: .net中安全策略的实施(二)
  • 86: .net中安全策略的实施(三)
  • 87: .net本质论第10章:基于CLR的程序与其周围环境是如何联系的
  • 88: 类型的布局:auto、sequential和explicit
  • 89: CLR外部环境-类型的布局(二)
  • 90: CLR执行模式:托管执行和非托管执行
  • 91: .net本质论第十章:非托管模块
  • 92: 非托管模块-P/Invoke和参数副本
  • 93: MarshalAs特性、RCW与CCW架构
  • 94: MarshalAs特性、RCW与CCW架构(二)
  • 95: CLR加载的机制与选择
  • 96: CLR加载的机制与选择(二)
  • 97: 作为COM组件的CLR
  • 98: CLR对象模型与探测器
  • 99: .net专业词汇汇总(一)
  • 100: .net专业词汇汇总(二)
最新评论
  • 4515465515
  • 21321
  • 2222
  • 非常棒
  • asdfwerwe

    ewrt
    wert
    wert
    ew
    t
    ew
    rtew
    rt
    w
    et
    we
    r
    t
    wer'> 啊委任为 asdfwerwe ewrt wert wert ew t ew rtew rt w e
  • 1111
  • 涨姿势了
  • onEndEdit 1.3.5 想用
  • 很好的列子
  • 有没有添加easyui 的js
  • 你这代码有问题,效果出来不了
  • 这样开发简单吧,基本上不学编程也可以开发了
  • 这个没有下载地址,可QQ联系我:879621940
  • 这样开发程序还是第一次见到
  • 下载下载下载,那里有下载地址。

AppDomain和对象(回顾)

创建时间:2013年04月03日 15:27  阅读次数:(5740)
分享到:
上一节 下一节
本章开始就将AppDomain作为执行范围。其中,大部分讨论都是将AppDomain描绘成对象和类型的“家”。尤其是,对象的作用域就是特定的AppDomain,并且,对象引用只是引用同一个AppDomain中的对象。然而,在已经谈到的AppDomain 接口方面还有一点不一致性。所谓的不致性就是SetData和GetData机制。

示例8.3将代码插入到外部AppDomain中。在那个例子中,程序使用SetData和GetData机制,从一个AppDomain到另一个AppDomain传递被加载的程序集的数量。然而,通过考察下面两个方法的签名,你可以将对象引用保存在某个AppDomain的公共属性中,并由另一个AppDomain提取(并且使用!)它:
static public void SetData(String name,object value);
static public object GetData(string name);

事实上,这正是示例8.3代码所做的工作。你可能还想将某个AppDomain的对象引用迁移到另一个域中,而这个对象引用又是AppDomain相关的。答案就是封送(marshaling)。

CLR将所有对象、值和对象引用的作用域定为特定的AppDomain。当需要将引用或者值传给另一个AppDomain时,必须首先封送它。CLR封送的基础架构大部分是在System.Runtime.Remoting命名空间下。特别是,System.Runtime.Remoting.RemotingServices有两个静态方法Mashal和Unmashal,它们是封送的基础。

RemotingServices.Mashal方法接收类型System.Object的对象引用,并且返回一个可序列化的System.Runtime.Remoting.Remoting Services.objRef对象,它能够以序列化格式传给其他AppDomain。在接受序列化的ObjRef的基础上,通过使用RemotingServices.Unmashal方法可以获得合法的对象引用。当在外部AppDomain中调用AppDomain.SetDaLa时,CLR调用RemotingServices.Mashal方法。类似地,在外部AppDomain中调用AppDomain.GetData时,将返回一个封送的引用。它在方法完成之前,通过RemotingServices.Unmashal方法进行转换。

当你封送一个对象引用时,该对象的具体类型确定封送将如何实际工作。如表8.4所示,共有三种场景。
灵活性(aglity)与对象

默认情形下,类型是远程未知的(remote-unaware),并且不支持跨AppDomain的封送。对远程未知类型的实例进行封送将导致失败。

如果类型直接或者间接派生于System.MarshalByRefObject,那么,这个类型就是AppDornain绑定的(AppDomain-bound)。AppDomain绑定的类型的实例将按引用封送。这意味着CLR将给被封进对象(引用)的接收者一个代理,它将所有成员的访问路由(转发)到该对象所属的AppDomain(home AppDomain)中。从技术上讲,代理只是将实例成员的访问转发到对象所属的AppDomain.从不转发静态方法。

那些没有派生于MarshalByRefObject但却能够支持对象序列化(通过[System.Serializable]伪定制特性)的类型被认为与任何AppDomain都是非绑定的(unbound)。非绑定类型的实例是按值封送的。这意味着CLR将给被封送对象(引用)的接收者提供一个原始对象的非连接的克隆,图8.10展示了这三种行为。
跨AppDomin封送对象

当对一个跨AppDomain的代理进行调用时,封送就会隐式地发生。CLR将方法调用的输入参数封送到序列化的请求消息中,由CLR发送到目标AppDomain。当目标AppDomain接收到序列化的请求后,它首先对这个消息进行反序列化,并将参数压入到新的堆栈帧中,在CLR将这个方法分发到目标对象之后,CLR将输出参数和返回值封送到序列化的响应消息中.由CLR送回调用方的AppDomain.然后,CLR取消它们的封送(unmarshal),同时将它们放回调用方的堆栈上。

图8.11展示了跨AppDomain的远程处理架构。CrossAppDomainChannel的工作就是获取位块传输(BLT)的堆栈帧,并将它序列化到缓冲区中,用于通过信道发送到目标AppDomain。目标AppDomain的信道基础结构对消息进行反序列化,并将其传递到适合的消息接收器上,最终形成堆栈帧,并且在目标对象上调用方法。每个AppDomain维护—个身份表(identity table),它在被封送对象的相应消息接收器上映射一个唯一的识别符(名为URI)。该URI在被封送的对象引用中出现,并且代理会在每一个向外的请求消息中设置它。
跨域的方法调用

当使用跨AppDomain的代理时,需要特别强调的是:CLR必须将这两个AppDomain中的元数据都加载进来,用于代理用到的所有类型。即,这两个AppDomain必须访问同样的程序集。并且,当这两个AppDomain驻留在不同的机器上时,这两台机器必须访问共享类型的元数据。

例如,考虑下面的程序,它将在一个子AppDomain中创建一个对象:
using System;
class App{
static void Main(){
//创建域
AppDomain child=AppDomain.CreateDomain(“c”,null);
//在新的域中创建对象
Object proxy=child.CreateInstance(“someassm”,”Bob”).Unwrap();

//向下类型转换,并且调用
Bob b=(Bobproxy;
b.f();
}
}

由于代理需要Bob的元数据,因此,子域和父域都需要访问包含Bob元数据的someassm程序集。

细心的读者可能注意到上面示例中的Unwrap调用.AppDomain.CreateInstance方法并不返回正常的对象引用。更进一步说,它返回一个象句柄(object handle)。对象句柄类似于被封送的对象引用。AppDomain.Createlnstance返回一个对象句柄,而不是真实的对象引用,这样便避免请求调用方AppDomain中的元数据。例如,考虑前面程序的变体:
using System;
class App{
static void Main()
{
//创建两个域
AppDomain c1=AppDomain.CreateDoamin(“c1”,null);
AppDomain c2=AppDomain.CreateDoamin(“c2”,null);
//在第一个域中创建对象
Object handle=c1.CreateInstance(“someassm”,”Bob”);
//在c2的属性中保存对象的句柄
c2.SetData(“HeresYourHandle”,handle);
//运行某个程序
c2.ExecuteAssembly{“foo.exe”,null,null};
}
}

在这个程序中,由于AppDomain.CreateInstance的结果没有在父域中解除封装(unwrapped),因而,CLR不需要在父域中加载“someassm”程序集。那是因为直到调用Unwrap时,CLR才需要元数据,而在这里CLR将只在第二个子域中执行)。

我们走到哪儿了
AppDomain确定了类型和对象运行时的作用域。AppDomain是被用作独立于应用程序的模型,它们可能(或者不可能)共享os进程。AppDomain通过程序集解析器和加载器,可以广泛地变互并且,支持更为丰富的封送层,从而支持应用程序之间的通信。`€{US0WcTW
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf】

打赏

取消

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

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

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

上一节 下一节

最新评论

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

聚圣源道琼斯股指期货木屋烧烤免费给女孩宝宝起个好名字关于月嫂公司起什么名好随手拍违章app官方下载青春期撞上更年期演员表www.ccc.36.com孟氏女孩鼠年起名大全起姓名测试吉凶华为w3店名起名大全打分测试姓郭什么起名起店名大全免费取名字免费起名张姓男孩五行起名是不是扯淡抒情的句子实景163302koudai8汤店起名女儿的起名库聊斋新编演员表起名姓陆斗战胜佛之大圣之泪个体户起名可以叫工作室吗酒店用品起店铺名放飞心灵凤凰卫视在线直播龚玥菲新金梅3D无删减锁屏软件淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化