最近在苦学.NET底层框架模型,发现.NET深入真的不是一般的难,不开源、没有相关系统的官方的书籍做学习资料,只能零散的看MSDN。要想摸熟.NET的模型真的并非易事。慢慢来吧。[王清培版权所有,转载请给出署名]

.NET应用程序域(AppDomain)是我们所有.NET应用程序的逻辑宿主容器。初次接触会感觉到AppDomain离我们日常开发比较远,不常用到。其实是我们很少接触一些复杂而底层的系统结构。在日常的开发中,我们多数是基于数据库的管理信息系统(MIS),做增、删、改、查的操作。我始终认为作为开发人员要注意自己的发展方向,要时刻提醒自己的职业规划,不要盲目的将自己的黄金时间用在“寻找另一艘行驶很慢的小帆船上”【.NET之降龙十八掌】,

在我们打算将整个人生都投入到IT中时,视乎有很多时间可以利用,但是仔细想想我们能用的时间很少。一天下来除去工作的时间就是休息的时间,我们只能剥削自己休息的时间,更是剥夺陪家人的时间。就想周公【周公的专栏】所说的,我们的生活不仅仅只有技术,我们应该只剥夺自己的时间而不是剥夺陪家人的时间。在家人休息的时候我们用来学习,在家人出去买菜的时候我们用来学习,在家人需要你的时候千万不要用“我要学习”的借口回避。[王清培版权所有,转载请给出署名]

言归正传,上面只是本人对生活的一点小小的感悟吧。

本篇文章我们来简单的了解一下.NET逻辑宿主的相关概念。

在传统的Win32的程序中,进程是独立的运行空间,在一些大型系统中,通常都是将系统中的核心功能分解出来用独立的进程来处理,一方面是为了能获得更高的系统性能、吞吐量。另一方面是为了能隔离功能之间的错误异常,为了使功能之间互不干扰,用进程进行隔离,再通过IPC或者其他的方式进行进程间通信,当某个功能发生严重错误的时候不会使整个系统强制关闭。

其实.NET的应用程序域诞生的初衷有点这个意思,用AppDomain进行隔离错误异常。

在我们开发大型系统的时候,或者是开发系统核心组件的时候肯定是需要考虑系统的容错性的,尤其是在一些实时监控的功能,是绝对不允许出现异常中断整个系统的。

那么.NET为我们提供了AppDomain的概念,它是程序在进程中的逻辑宿主。既然是逻辑宿主,那么他们还是共享同一地址空间。在系统的托管堆中还是不分AppDomain的概念的。[王清培版权所有,转载请给出署名]

每一个可执行应用程序都会独立开启一个进程,当系统加载器将控制权交给CLR的时候,.NET会用默认的AppDomain来宿主应用程序。默认的应用程序域是由.NET开启的,当系统启动起来之后,我们可以创建应用程序域,然后在该域里面创建对象。【其实我真的很想知道到底AppDomain是怎么起到隔离的作用的,如果哪位高手了解的请赐教。】

我们看一个下例子:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Runtime.Remoting;
  5. namespace MyClassLibrary
  6. {
  7. /// <summary>
  8. /// 使用代理进行调用
  9. /// </summary>
  10. public class Class2 : MarshalByRefObject
  11. {
  12. int number = 0;
  13. public void PrintAppDomain()
  14. {
  15. Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
  16. number += 1;
  17. Console.WriteLine(number);
  18. }
  19. }
  20. }

我定义一个Class2的类,继承自MarshalByRefObject对象,该对象是跨域远程访问的抽象基类,使用引用传递进行调用。后面讲到远程处理的时候我们再来详细的分解MarshalByRefObject对象。

  1. //创建新的应用程序域
  2. Console.WriteLine("default appdomain name:\n" + AppDomain.CurrentDomain.FriendlyName);
  3. AppDomain newdomain = AppDomain.CreateDomain("newadddomain");
  4. object refobject = newdomain.CreateInstanceAndUnwrap("MyClassLibrary", "MyClassLibrary.Class2");
  5. (refobject as MyClassLibrary.Class2).PrintAppDomain();
  6. Console.Read();

我们首先输出默认的应用程序域的名称,通常是应用程序的名称。如果在VS调试环境下会出现AppName.VsHost.exe名称。这是因为VS为了调试用自己的进程来启动我们的程序。然后在默认的应用程序域的里面创建了一个新的应用程序域,域名为newadddomain,其实这个时候我们拿到仅仅是新应用程序的透明代理。

这个客户端透明代理对象,背后隐藏了一个真实代理。细节我们后面文章在讨论。

细节这里就不扯了。

我们来看一下应用程序域是大概怎么创建的,包括代理的创建、位置的保存。

简单解释一下:客户端通过AppDomain静态方法创建一个新的应用程序域,然后封装ObjRef对象,由于要在客户端应用程序域中调用新的应用程序的功能,设计到了跨域的访问,所以.NET通过ObjRef保存新的应用程序的位置信息以便在客户端生成代理。当ObjRef到达客户端之后,系统进行反序列化进行动态构造真实代理和透明代理,透明代理是动态创建的,必须继承自我们客户端调用的类型,可能用到了一些动态生成、编译的技术。ObjRef扩展自MarShalByRefObject对象,专门用来保存服务端对象的位置信息,并且是可序列化的。

.NET简谈组件程序设计之(AppDomain应用程序域)相关推荐

  1. .NET简谈组件程序设计之(上下文与同步域)

    我们继续学习.NET多线程技术,这篇文章的内容可能有点复杂.在打破常理之后,换一种新的思考模型最为头疼.这篇文章里面会涉及到一些不太常见的概念,比如:上下文.同步域等等.我也是最近才接触这些关于组件编 ...

  2. .NET简谈组件程序设计之(手动同步)

    在上一篇文章".NET简谈组件程序设计之(上下文与同步域) "中,我们学习了关于一些上下文和同步域的概念,可以利用这两个技术来进行自动同步. 今天我们主要学习怎么手动来执行同步,能 ...

  3. .NET简谈组件程序设计之(渗入序列化过程)

    在本人的上一篇文章".NET简谈组件程序设计之(初识序列化.持久化) "中,我们基本上了解了什么叫序列化和持久化.通过系统为我们提供的服务,我们可以很方便的进行二进制序列化.SOA ...

  4. .NET简谈组件程序设计之(异步委托)

    说到委托我想大家基本上都用过的,今天这篇文章就来讲解关于委托的异步奥秘. 在我们正常使用的时候很少会去用异步委托技术来提高代码效率.委托的好处就是能对方法进行面向对象的封装,随意传递.在任何组件客户代 ...

  5. .NET简谈组件程序设计之(详解NetRemoting结构)

    在本人的上一篇文章中只是简单的介绍了一下.NETRemoting的一般概念和基本的使用.这篇文章我想通过自己的学习和理解将对.NETRemoting的整体的一个框架进行通俗的讲解,其中最重要的就是信道 ...

  6. 浅谈单片机程序设计中的“分层思想”!

    浅谈单片机程序设计中的"分层思想",并不是什么神秘的东西,事实上很多做项目的工程师本身自己也会在用.看了不少帖子都发现没有提及这个东西,然而分层结构确是很有用的东西,参透后会有一种 ...

  7. php谈谈你对分布式的理解,简谈关于对分布式处理的理解

    原标题:简谈关于对分布式处理的理解 最近这段时间一直在看分布式有关的东西,但是关于分布式自己还是不能很好的理解,所以本文对分布式基础概念进行下学习. 分布式处理 首先先了解一下分布式处理,分布式处理和 ...

  8. .NET简谈事务、分布式事务处理

    在本人的 " .NET简谈事务本质论"一文中我们从整体上了解了事务模型,在我们脑子里能有一个全局的事务处理结构,消除对数据库事务的依赖理解,重新认识事务编程模型. 今天这篇文章我们 ...

  9. linux进程通信核心态时间,Linux进程管理简谈

    Linux系统进程管理简谈 进程是什么? 进程是对处理器.主存和I/O设备的抽象表示. 进程是操作系统对一个正在运行的程序的一种抽象,在一个系统上可以同时运行多个进程,而每个进程都好像在独占的使用硬件 ...

最新文章

  1. 《音乐商店》第4集:自动生成StoreManager控制器
  2. Enterprise Library 5.0发布
  3. net以execl做数据库_[原创]Net实现Excel导入导出到数据库(附源码)
  4. 【Python 必会技巧】使用 split() 方法对字符串进行切片
  5. 源码角度解释fragment的坑(二)
  6. oracle有哪两种内存结构,Oracle体系结构详解(物理构造,内存结构和逻辑结构)...
  7. 生日祝福html_更新,礼包选择,头像框及太子生日金币活动
  8. Spring WebSocket入门(一) 转载
  9. 机器学习| 面试题:11、LDA算法原理
  10. 伺服电机转矩常数的标定方法
  11. android全面屏像素密度,屏幕像素密度超400ppi,让你感受视觉的极限
  12. 2023年辽宁大学马克思主义中国化研究考研上岸前辈备考经验指导
  13. 电脑和ubuntu开发板用网线连接的方法
  14. 基于DFSMN-CTC及CTC-CE联合训练的声学模型
  15. PMP和MBA、MPA的比较
  16. 小孟网站被黑客攻击,已经哭晕在厕所……
  17. php redis访问量,redis实现点击量浏览量
  18. 【蓝桥杯备赛】历年真题解答+知识点总结
  19. Android之HorizontalScrollView(一)
  20. GTK+编程入门(2)—GTK+程序结构

热门文章

  1. /etc/issue、shutdown练习
  2. django基本操作
  3. Linux~上部署.net MVC出现的问题与解决
  4. 分析Cocos2d-x横版ACT手游源码 1、公共
  5. The Memory Managerment of the Computer
  6. C语言中的itoa和atoi函数的实现
  7. java下使用Thumbnailator类库来对图片进行缩放
  8. 告别2010,迎来2011
  9. 【CentOS 7笔记35】,几个特殊符号和一些常用命令#
  10. linux 调用栈打印