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

简介:

最近在苦学.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.  
  6. namespace MyClassLibrary  
  7. {  
  8.     /// <summary>  
  9.     /// 使用代理进行调用  
  10.     /// </summary>  
  11.     public class Class2 : MarshalByRefObject  
  12.     {  
  13.         int number = 0;  
  14.         public void PrintAppDomain()  
  15.         {  
  16.             Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);  
  17.             number += 1;  
  18.             Console.WriteLine(number);  
  19.         }  
  20.     }  
  21. }  

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

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

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

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

细节这里就不扯了。

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

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






 本文转自 王清培 51CTO博客,原文链接:http://blog.51cto.com/wangqingpei557/665249,如需转载请自行联系原作者



相关文章
|
7天前
|
C# Windows
.NET开源免费的Windows快速文件搜索和应用程序启动器
今天大姚给大家分享一款.NET开源(MIT License)、免费、功能强大的Windows快速文件搜索和应用程序启动器:Flow Launcher。
|
2月前
|
前端开发 C# 数据库
.NET中使用BootstrapBlazor组件库Table实操篇
.NET中使用BootstrapBlazor组件库Table实操篇
|
3月前
|
开发框架 前端开发 .NET
七天.NET 8操作SQLite入门到实战 - (1)第七天BootstrapBlazor UI组件库引入
七天.NET 8操作SQLite入门到实战 - (1)第七天BootstrapBlazor UI组件库引入
|
4月前
|
算法 Java 调度
|
7天前
|
搜索推荐 API C#
.NET开源快速、强大、免费的电子表格组件
.NET开源快速、强大、免费的电子表格组件
|
19小时前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012
|
4月前
|
小程序 安全 JavaScript
.NET微信网页开发之通过UnionID机制解决多应用用户帐号统一问题
.NET微信网页开发之通过UnionID机制解决多应用用户帐号统一问题
.NET微信网页开发之通过UnionID机制解决多应用用户帐号统一问题
|
4月前
|
SQL 数据库 开发工具
“.NET视频总结:认识框架的结构和组件,掌握开发工具的奥妙“
“.NET视频总结:认识框架的结构和组件,掌握开发工具的奥妙“
55 0
|
4月前
|
C# Windows
C#安装“Windows 窗体应用(.NET Framework)”
C#安装“Windows 窗体应用(.NET Framework)”
50 0