什么是AppDomain

我们都知道windows进程,它起到应用程序隔离的作用,带来的好处是,当某个进程发生错误的时候,不会影响其他的进程,系统也不会受到影响。但是,创建windows进程的代价是很大的。.net推出AppDomain的作用也是隔离,如果能确保应用程序都是安全代码(managed code),那么appdomain其实就可以起到进程的作用。每个appdomain里有自己的堆,负责自己内部对象的创建和销毁,对象一般不能夸appdomain访问。

当应用程序启动,CLR加载后,会创建一个appdomain(默认的,它知道进程结束才会unload),程序集会在此appdomain中加载,运行。

Appdomain,程序集,进程的关系如下图所示:

这里有个问题,即同样的assembly会在不同的appdomain中使用,会造成资源的浪费,所以出现了domain-neutral assemblies,也就是说,这些assemblies与appdomain无关,CLR负责管理,对象的创建,销毁都由CLR负责,当然,它们也只有等到CLR结束,也就是进程结束时才能unload。

AppDomain访问对象

CLR Via C#书中第22章的例子,很好的解释了如何跨appdomain对象访问。

它会建一个新的appdomain,在这里会创建(返回)3种类型的对象,1个是继承自MarshaByRefObject类型的对象,1个是标注了[Serializable]的类型的对象,另一个是普通类型对象,对应有3个#demo。

#demo1

在新的appdomain中动态创建继承自MarshaByRefObject类型的对象,然后在默认的appdomain中使用它的方法:

(1)     在新appdomain中create的对象,返回给原appdomain,实际上返回给原appdomain的是一个代理,也就是说mbrt变量指向的是一个proxy,而非新appdomain中的instance,所以IsTransparentProxy返回true。

(2)     在代理上执行方法,显然是在远程执行。

(3)     当新的appdomain卸载后,代理找不到原始对象,抛异常。

#demo2

在新的appdomain中动态创建标有[Serializable]的类型的对象,然后再默认的appdomain中使用

(1)     在新的appdomain创建的,返回原appdomain的,不会是代理,而是新appdomain中创建的对象的copy,在跨appdomain边界的时候序列化成字节流,回到原appdomain时,反序列化回来的,所以IsTransparentProxy返回false。

(2)     由于mbvt指向的对象不是代理对象,所以在本地(本appdomain)执行。

(3)     由于在本地执行,所以尽管新的appdomain被unload了,仍然可以继续执行。

#demo3

在新的appdomain中动态创建普通类型对象,既没有继承自MarshalByRefObject,也没有标注[Serializable],然后再默认的appdomain中使用,这个时候,由于新appdomain发现,既不能按Marshal by ref封送,就按Marshal by value封送,但是却不能序列化,所以只有跑序列化失败的异常了:

结论:跨appdomain对象访问有2种方式:by ref, by value,

(1)     by ref要求对象继承自MarshalByRefObject,并且在目的appdomain中使用的是代理。

(2)     by value要求对象标注[Serializable],即能被序列化,那么在目的appdomain中,使用的就是原对象的副本了。

.NET跨AppDomain访问对象的更多相关文章

  1. 解析.NET对象的跨应用程序域访问--AppDomain(上篇)

    在目前的项目开发中,分布式开发已经逐渐成为主流.一个项目要是没有采用分布式架构,都不好意思跟别人说这是一个完整的项目.这句话虽然有些过激,但是随着人们对效率的要求在提高,以及产品需要提升用户体验.只有 ...

  2. 解析.NET对象的跨应用程序域访问(下篇)

    转眼就到了元宵节,匆匆忙忙的脚步是我们在为生活奋斗的写照,新的一年,我们应该努力让自己有不一样的生活和追求.生命不息,奋斗不止.在上篇博文中主要介绍了.NET的AppDomain的相关信息,在本篇博文 ...

  3. 解析.NET对象的跨应用程序域访问(上篇)

    在目前的项目开发中,分布式开发已经逐渐成为主流.一个项目要是没有采用分布式架构,都不好意思跟别人说这是一个完整的项目.这句话虽然有些过激,但是随着人们对效率的要求在提高,以及产品需要提升用户体验.只有 ...

  4. Chrome浏览器扩展开发系列之十五:跨域访问的XMLHttpRequest对象

    XMLHttpRequest对象是W3C的标准API,用于访问服务器资源.XMLHttpRequest对象支持多种文本格式,如XML和JSON等.XMLHttpRequest对象可以通过HTTP和HT ...

  5. 解决Entity Framework查询匿名对象后的跨域访问的一种方式

    在Entity Framework中,可以使用lambda表达式进行对数据的查询,而且可以将查询结果直接映射为对象或者对象列表,这极大的提高的开发速度,并且使数据层的数据更加方便处理和传递.但是很多时 ...

  6. Asp.Net SignalR 使用记录 技术回炉重造-总纲 动态类型dynamic转换为特定类型T的方案 通过对象方法获取委托_C#反射获取委托_ .net core入门-跨域访问配置

    Asp.Net SignalR 使用记录   工作上遇到一个推送消息的功能的实现.本着面向百度编程的思想.网上百度了一大堆.主要的实现方式是原生的WebSocket,和SignalR,再次写一个关于A ...

  7. 对象存储 COS 帮您轻松搞定跨域访问需求

    背景 早期为了避免 CSRF(跨站请求伪造) 攻击,浏览器引入了 "同源策略" 机制.如果两个 URL 的协议,主机名(域名/IP),端口号一致,则视为这两个 URL " ...

  8. 阿里云对象存储OSS————跨域资源共享(CORS)(m3u8 无法加载m3u8:跨域访问被拒绝)

    今天在做视频直播录像的时候,添加一个录制APP的.M3U8文件到OSS的一个test文件中存储,结果是访问不到了: 提示:无法加载m3u8:跨域访问被拒绝!!!!! 项目代码测试地址:https:// ...

  9. cookie 跨域访问的解决方案

    Cookie 同域单点登录  最近在做一个单点登录的系统整合项目,之前我们使用控件实现单点登录(以后可以介绍一下).但现在为了满足客户需求,在不使用控件情况下实现单点登录,先来介绍一下单点登录.    ...

随机推荐

  1. 关于for、foreach、filter等的一些用法

    通常我们使用得最熟悉的是for循环. 比如对于一组数字的排大小,可以使用冒泡法. var a=[];     for(var d=0;d<5;d++){         var b=window ...

  2. 第三篇T语言实例开发,图色操作

    ---恢复内容开始--- 图色的基本操作 1.找颜色色命令的基本操作 坐标点取色:获取指定坐标点的颜色 区域找色:在指定区域里找某一个颜色 模糊找色:在指定区域里找某一个颜色,可以设置相似度 多点找色 ...

  3. 数组map()方法和filter()方法及字符串startsWith(anotherString)和endsWith(anotherString)方法

    map方法的作用不难理解,"映射"嘛,也就是原数组被"映射"成对应新数组 var newArr = arr.map(function() {});例子: var ...

  4. canvas 画字

    用canvas画字还是头一回,要想和UI设计的画的一模一样还是真有些苦难,不过现在实现的效果已经很像了. <!--通过字体文件引入字体--><style>@font-face ...

  5. JSBinding / FAQ & Trouble Shooting

    Q: Why javascript file extension is .javascript?A: Because Unity treats .js files as Unity script an ...

  6. VS2013 统计代码量(使用正则表达式)

    年尾了,需要统计一下今年各个项目的工作量,统计一下各个项目的代码行数: 具体操作步骤如下: 1.选中解决方案,快捷键:Ctrl+Shift+F,打开搜索框,在查找内容中输入正则表达式:"b* ...

  7. .NET设计规范————命名规范

    NET设计规范:约定.惯用法与模式———命名规范 前言:          最近在看<.NET设计规范:约定.惯用法与模式>一书,主要还是讲.NET的设计规范,以前对这一块也不是特别在意, ...

  8. AngularJS的MVC中C的实现

    Angular的MVC中C的实现 注:在controller操作Dom效率是很低的,我们使用封装的指令去操作Dom

  9. 【java】之joda-time的使用

    Joda-Time Home:http://joda-time.sourceforge.net/ JavaDoc:http://joda-time.sourceforge.net/apidocs/in ...

  10. 线程让出实验【RT-Thread学习笔记 4】

    API: rt_thread_yield 线程函数中调用,本线程释放MCU.如果此时有别的相同优先级的任务整处于等待状态,将获得MCU使用权. 线程让出就是给OS增加一个任务调度的机会. 创建两个线程 ...