.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,如需转载请自行联系原作者



相关文章
|
存储 Shell Linux
快速上手基于 BaGet 的脚本自动化构建 .net 应用打包
本文介绍了如何使用脚本自动化构建 `.net` 应用的 `nuget` 包并推送到指定服务仓库。首先概述了 `BaGet`——一个开源、轻量级且高性能的 `NuGet` 服务器,支持多种存储后端及配置选项。接着详细描述了 `BaGet` 的安装、配置及使用方法,并提供了 `PowerShell` 和 `Bash` 脚本实例,用于自动化推送 `.nupkg` 文件。最后总结了 `BaGet` 的优势及其在实际部署中的便捷性。
1018 10
|
JSON 数据格式
【Azure Fabric Service】演示使用PowerShell命令部署SF应用程序(.NET)
本文详细介绍了在中国区微软云Azure上使用Service Fabrics服务时,通过PowerShell命令发布.NET应用的全过程。由于Visual Studio 2022无法直接发布应用,需借助PowerShell脚本完成部署。文章分三步讲解:首先在Visual Studio 2022中打包应用部署包,其次连接SF集群并上传部署包,最后注册应用类型、创建实例并启动服务。过程中涉及关键参数如服务器证书指纹和服务端证书指纹的获取,并附带图文说明,便于操作。参考官方文档,帮助用户成功部署并运行服务。
461 73
|
C# Android开发 iOS开发
2025年全面的.NET跨平台应用框架推荐
2025年全面的.NET跨平台应用框架推荐
857 23
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
443 5
|
开发框架 .NET API
Windows Forms应用程序中集成一个ASP.NET API服务
Windows Forms应用程序中集成一个ASP.NET API服务
497 9
|
JSON 算法 安全
JWT Bearer 认证在 .NET Core 中的应用
【10月更文挑战第30天】JWT(JSON Web Token)是一种开放标准,用于在各方之间安全传输信息。它由头部、载荷和签名三部分组成,用于在用户和服务器之间传递声明。JWT Bearer 认证是一种基于令牌的认证方式,客户端在请求头中包含 JWT 令牌,服务器验证令牌的有效性后授权用户访问资源。在 .NET Core 中,通过安装 `Microsoft.AspNetCore.Authentication.JwtBearer` 包并配置认证服务,可以实现 JWT Bearer 认证。具体步骤包括安装 NuGet 包、配置认证服务、启用认证中间件、生成 JWT 令牌以及在控制器中使用认证信息
697 2
|
SQL XML 关系型数据库
入门指南:利用NHibernate简化.NET应用程序的数据访问
【10月更文挑战第13天】NHibernate是一个面向.NET的开源对象关系映射(ORM)工具,它提供了从数据库表到应用程序中的对象之间的映射。通过使用NHibernate,开发者可以专注于业务逻辑和领域模型的设计,而无需直接编写复杂的SQL语句来处理数据持久化问题。NHibernate支持多种数据库,并且具有高度的灵活性和可扩展性。
588 2
|
数据采集 JSON API
.NET 3.5 中 HttpWebRequest 的核心用法及应用
【9月更文挑战第7天】在.NET 3.5环境下,HttpWebRequest 类是处理HTTP请求的一个核心组件,它封装了HTTP协议的细节,使得开发者可以方便地发送HTTP请求并接收响应。本文将详细介绍HttpWebRequest的核心用法及其实战应用。
903 6
|
Linux iOS开发 开发者
跨平台开发不再难:.NET Core如何让你的应用在Windows、Linux、macOS上自如游走?
【8月更文挑战第28天】本文提供了一份详尽的.NET跨平台开发指南,涵盖.NET Core简介、环境配置、项目结构、代码编写、依赖管理、构建与测试、部署及容器化等多个方面,帮助开发者掌握关键技术与最佳实践,充分利用.NET Core实现高效、便捷的跨平台应用开发与部署。
1893 3
|
开发框架 监控 安全
.NET 应用程序安全背后究竟隐藏着多少秘密?从编码到部署全揭秘!
【8月更文挑战第28天】在数字化时代,.NET 应用程序的安全至关重要。从编码阶段到部署,需全面防护以保障系统稳定与用户数据安全。开发者应遵循安全编码规范,实施输入验证、权限管理和加密敏感信息等措施,并利用安全测试发现潜在漏洞。此外,部署时还需选择安全的服务器环境,配置 HTTPS 并实时监控应用状态,确保全方位防护。
291 3