.NET基础:应用程序域AppDomain(net应用程序设计)
cac55 2024-10-11 11:01 21 浏览 0 评论
最近再搞.NET中的插件开发,其中涉及到应用程序的热升级,在很多情况下、我们希望用户对应用程序的升级是无感知的,并且尽可能不打断用户操作的。
虽然在Web 或者 WebAPI上,由于多点的存在可以逐个停用单点进行系统升级,而不影响整个服务。但是 客户端却不能这样做,毕竟用户一直在使用着。
那么有没有一种方式,可以在用户无感知的情况下(即、不停止进程的情况下)对客户端进行升级呢?
答案是肯定的, 这就是我今天想说的、可以对应用程序进行热升级。当然这种方式也同样适用于 ASP.NET ,这里最核心的就是需要理解:应用程序域AppDomain
不过当前随笔是以 WPF为例子的,并且原理是一样的、代码逻辑也是一样的。
一、应用程序域AppDomain
在介绍插件技术之前、我们需要先了解一些基础性的知识,第一个就是应用程序域AppDomain.
操作系统和运行时环境通常会在应用程序间提供某种形式的隔离。 例如,Windows 使用进程来隔离应用程序。 为确保在一个应用程序中运行的代码不会对其他不相关的应用程序产生不良影响,这种隔离是必需的。这种隔离可以为应用程序域提供安全性、可靠性, 并且为卸载程序集提供了可能。
在 .NET中应用程序域AppDomain是CLR的运行单元,它可以加载应用程序集Assembly、创建对象以及执行程序。
在 CLR 里、AppDomain就是用来实现代码隔离的,每一个AppDomain可以单独创建、运行、卸载。
如果默认AppDomain监听了 UnhandledException 事件,任何线程的任何未处理异常都会引发该事件,无论线程是从哪个AppDomain中开始的。
如果一个线程开始于一个已经监听了 UnhandledException事件的 app domain, 那么该事件将在这个app domain 中引发。
如果这个app domian 不是默认的app domain, 并且 默认 app domain 中也监听了 UnhandledException 事件, 那么 该事件将会在两个app domain 中引发。
CLR启用时,会创建一个默认的AppDomain,程序的入口点(Main方法)就是在这个默认的AppDomain中执行。
AppDomain是可以在运行时进行动态的创建和卸载的,正因如此,才为插件技术提供了基础(注:应用程序集和类型是不能卸载的,只能卸载整个AppDomain)。
AppDomain和其他概念之间的关系
1、AppDomain vs 进程Process
AppDomain被创建在Process中,一个Process内可以有多个AppDomain。一个AppDomain只能属于一个Process。
2、AppDomain vs 线程Thread
应该说两者之间没有关系,AppDomain出现的目的是隔离,隔离对象,而 Thread 是 Process中的一个实体、是程序执行流中的最小单元,保存有当前指令指针 和 寄存器集合,为线程(上下文)切换提供可能。如果说有关系的话,可以牵强的认为一个Thread可以使用多个AppDomain中的对象,一个AppDomain中可以使用多个Thread.
3、AppDomain vs 应用程序集Assembly
Assembly是.Net程序的基本部署单元,它可以为CLR提供元数据等。
Assembly不能单独执行,它必须被加载到AppDomain中,然后由AppDomain创建程序集中的类型 及 对象。
一个Assembly可以被多个AppDomain加载,一个AppDomain可以加载多个Assembly。
每个AppDomain引用到某个类型的时候需要把相应的assembly在各自的AppDomain中初始化。因此,每个AppDomain会单独保持一个类的静态变量。
4、AppDomain vs 对象object
任何对象只能属于一个AppDomain,AppDomain用来隔离对象。 同一应用程序域中的对象直接通信、不同应用程序域中的对象的通信方式有两种:一种是跨应用程序域边界传输对象副本(通过序列化对对象进行隐式值封送完成),一种是使用代理交换消息。
二、创建 和 卸载AppDomain
前文已经说明了,我们可以在运行时动态的创建和卸载AppDomain, 有这样的理论基础在、我们就可以热升级应用程序了 。
那就让我们来看一下如何创建和卸载AppDomain吧
创建:
AppDomainSetup objSetup = new AppDomainSetup(); objSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; this.domain = AppDomain.CreateDomain("RemoteAppDomain", null, objSetup);
创建AppDomain的逻辑非常简单:使用 AppDomain.CreateDomain 静态方法、传递了一个任意字符串 和 AppDomainSetup 对象。
卸载:
AppDomain.Unload(this.domain);
卸载就更简单了一行代码搞定:AppDomain.Unload 静态方法,参数就一个 之前创建的AppDomain对象。
三、在新AppDomain中创建对象
上文已经说了创建AppDomain了,但是创建的新AppDomain却是不包含任何对象的,只是一个空壳子。那么如何在新的AppDomain中创建对象呢?
this.remoteIPlugin = this.domain.CreateInstance("PluginDemo.NewDomain", "PluginDemo.NewDomain.Plugin").Unwrap() as IPlugin;
使用刚创建的AppDomain对象的实例化方法: this.domain.CreateInstance,传递了两个字符串,分别为 assemblyName 和 typeName.
并且该方法的重载方法 和 相似功能的重载方法多达十几个。
四、影像复制程序集
创建、卸载AppDomain都有、创建新对象也可以了,但是如果想完成热升级,还有一点小麻烦,那就是一个程序集被加载后会被锁定,这时候是无法对其进行修改的。
所以就需要打开 影像复制程序集 功能,这样在卸载AppDomain后,把需要升级的应用程序集进行升级替换,然后再创建新的AppDomain即可了。
打开 影像复制程序集 功能,需要在创建新的AppDomain时做两步简单的设定即可:
AppDomainSetup objSetup = new AppDomainSetup(); objSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; // 打开 影像复制程序集 功能 objSetup.ShadowCopyFiles = "true"; // 虽然此方法已经被标记为过时方法, msdn备注也提倡不使用该方法, // 但是 以.net 4.0 + win10环境测试,还必须调用该方法 否则,即便卸载了应用程序域 dll 还是未被解除锁定 AppDomain.CurrentDomain.SetShadowCopyFiles(); this.domain = AppDomain.CreateDomain("RemoteAppDomain", null, objSetup);
相关推荐
- 高中生又来卷我们了!手搓 Android 浏览器,可高度定制+脚本支持
-
回想一下,你曾经的暑假,是怎么度过的?可能是无尽的娱乐时光,或者是懒洋洋的休息日。然而,对于这位Gitee上的高中生来说,他选择在这个暑假里独立开发一款Android浏览器——Vie浏览器,...
- 网页加载CAD图纸的两个方案对比说明(网页浏览编辑DWG)
-
一.说明梦想控件提供两种技术在网页中加载CAD图纸,一个是OCX技术方案,另一个是HTML5技术方案,它们各有优缺点,用户需根据实际情况进行选择,下边分别说明一下。1、ocx技术方案(1)OCX技术是...
- 前后端分离的开源在线考试系统调试实战
-
开篇在我们的教育生涯中,或多或少的都接触过在线考试系统。例如大学里最常见的各种软件考试,上机考试等,那么有没有开源的这样的系统呢?当然是有了,今天就来调试个开源的在线考试系统。本文重点是调试,因为很多...
- 网友:小松鼠长大了!UC浏览器推出18周年专版logo引热议
-
近日,互联网厂商logo更新再次引发热议。作为国内手机浏览器的代表性厂商,UC浏览器的标志性logo小松鼠悄然发生了变化,在网友中引发了关注和讨论。依照UC微博官方账号的说法,这个全新的形象是UC18...
- 超多案例!谷歌AI模型Nano Banana的5个实用+趣味玩法
-
再不用这个AI修图神器,你的同行明天就把订单抢光了。谷歌刚放出的NanoBanana,能在一张照片里把背景、姿势、衣服一次换完,脸还是那张脸。实测把地铁照改成海边大片,只用一句话,三秒出图,不用PS来...
- 2025年最佳Windows数据恢复软件解决方案前5名
-
您是否正在寻找互联网上排名前五的WindowsPC最佳数据恢复软件解决方案?其实,网上有很多工具可以恢复已删除的文件。但并非所有应用程序都值得使用。值得信赖的文件恢复工具可以帮助您快速检索丢失、删...
- 电脑数据恢复软件推荐:10个顶级数据恢复软件分享
-
在数字化的工作与生活中,电脑文件误删除的情况时有发生,这不仅会引发我们的焦虑情绪,更可能导致重要数据的丢失。不过,幸运的是,借助正确的数据恢复软件,我们仍有机会找回那些被误删的文件。10个顶级数据恢复...
- 更懂国内APP的开源智能体!感知定位推理中文能力全面提升
-
更懂国内APP的开源智能体!感知定位推理中文能力全面提升“帮我点外卖,别点到广告位。”一句话,说出了多少人对手机自动化的真实期待。浙大和美团刚扔出来的开源项目UItron,就是冲着这句吐槽来的——它真...
- 美光首家推出采用EUV技术的1γ DDR5 DRAM芯片
-
美光科技宣布已开始向部分生态系统合作伙伴和客户出货1γ(1-gamma)16GbitDDR5DRAM芯片。美光声称,它是第一个采用1-gamma(1γ)节点的公司,该节点指的是DRAM工艺技术的第...
- DDR4的PCB设计及仿真_ddr pcb
-
以下文章来源于鼎阳硬件智库,作者王彦武DDR4关键技术和方法分析1.1DDR4与DDR3不同之处相对于DDR3,DDR4首先在外表上就有一些变化,比如DDR4将内存下部设计为中间稍微突出,边缘变...
- DDR4和DDR5内存的性能差距有哪些?
-
DDR4和DDR5内存的性能差距主要体现在带宽、延迟、能效及未来扩展性上,以下是关键差异的总结及选择建议:1.带宽与频率DDR4:主流频率为2133MHz–3600MHz,带宽约25.6–30.2...
- DDR5内存一根和两根的区别,建议收藏观看。
-
大家好,我是海韵,DDR5内存条,单条和双条有什么区别,如何选择,DDR5单条和双条内存在性能上存在差距,单条内存保持在64个通道,但内部升级为32乘以2,虽然出口速度相同,但内部运行略有提升,...
- Kingston FURY叛逆者DDR5 RGB CUDIMM内存评测 强势突破9000MT/s!
-
【ZOL中关村在线原创评测】当8000MT/s从当年的液氮超频艰难达成,到如今XMP轻松开启,DDR5内存频率的极限探索似乎看不到终点。在早先,我们曾为大家带来KingstonFURY品牌的叛逆者D...
- SK海力士将在年内推出1bnm 32Gb DDR5内存颗粒
-
IT之家4月25日消息,据韩媒NEWSIS报道,SK海力士在今日的2024年一季度财报电话会议上表示将在年内推出1bnm32GbDDR5内存颗粒。32Gb颗粒意味着消费级的...
- DRAM史上最大代际倒挂继续:三星将延长DDR4生产期限至2026年
-
IT之家8月6日消息,韩媒TheElec今天(8月6日)发布博文,报道称三星决定延长DDR41zDRAM的生产期限至2026年,一方面在DRAM史上最大代际倒挂中进...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 如何绘制折线图 (52)
- javaabstract (48)
- 新浪微博头像 (53)
- grub4dos (66)
- s扫描器 (51)
- httpfile dll (48)
- ps实例教程 (55)
- taskmgr (51)
- s spline (61)
- vnc远程控制 (47)
- 数据丢失 (47)
- wbem (57)
- flac文件 (72)
- 网页制作基础教程 (53)
- 镜像文件刻录 (61)
- ug5 0软件免费下载 (78)
- debian下载 (53)
- ubuntu10 04 (60)
- web qq登录 (59)
- 笔记本变成无线路由 (52)
- flash player 11 4 (50)
- 右键菜单清理 (78)
- cuteftp 注册码 (57)
- ospf协议 (53)
- ms17 010 下载 (60)