ASP.NET程序员应用程序域须知

ASP.NET程序员应用程序域须知,第1张

本文将讨论 NET的应用程序域 并且它们是如何对ASP NET的执行和调度产生影响的 当在Windows中启动Notepad程序时 众所周知程序会执行一个包含在容器内的进程 可以启动多个Notepad的实例 并且每个实例都会在一个专注的进行程运行 使用任务管理器 可以看到在系统中当前运行的所有进程的清单 一个进程包括可执行从 *** 作系统中保留的在内存中的代码和程序数据 在进程之内只少有一个包含在进程之内的正在执行指令的线程 并且在多数情况下有多个线程 如果程序打开了任何文件或者资源 这些资源将属于这个进程 一个进程也有一个分界线 包含在进程之内的错误代码不能在当前进程之外的地区腐化 在一个进程之内很容易通讯 但是专业技术要求一个进程对另一个进程通讯是必需的 每一个进程也在一个特殊的上下文安全系统中运行 这个安全系统规定在机器和网络中进程做什么 一个进程是一个在Windows *** 作系统中独立运行的最小单位 这会给在一个单一服务器上对一大堆应用程序的ISP提出一个问题 ISP将会分离每一个在同一个服务器上的与另一个公司的应用程序干扰的ASP NET应用程序 但是相关的发射和执行一个对成百上千的应用程序的过程成本禁止的 介绍应用程序域 NET介绍一个应用程序域的概念 或者AppDomain像一个过程 AppDomain是既是容器又是边界线 NET运行时间使用AppDomain作为代码和数据的容器 就像 *** 作系统一个过程作为代码和数据的容器一样 当 *** 作系统使用一个过程来分离不整齐的代码时 NET运行时间使用一个AppDomain来分离在一个安全边线内的代码 一个AppDomain仅仅属于一个单过程 但是单个过程能够保持多重的AppDomain 一个Appdomain创建起来相对容易(与一个过程比较起来) 并且与一个过程比较起来具有少的维护费用 由于这些原因 一个AppDomain是ISP(提供成千上万的应用程序)的很好的解决方案 每一个应用程序可以生存在一个独立的AppDomain之内 并且许多这样的AppDomain可以生存于一个单一的过程(节省费用)之内 AppDomain 在同服务器上创建了两个ASP NET应用程序 并且没有任何特殊配置 会发生什么事情呢?一个单一的ASP NET手工进程使ASP NET应用程序变成两方面的主要程序 在Windows XP和Windows 中 这一程序被命名为aspnet_wp exe 并且这一程序运行在本地的ASPNET计数器的前后安全关系中 在Windows 手工程序拥有w wp exe并且默认运行在NEOR SERVICE中 一个对旬可以进住在一个AppDomain中 每一个ASP NET应用程序将具有它自己的一套全局变量 Cache Application进住进同一进程 NET AppDomain是一个独立的单元 如果存有共享的或静态成员的类 并且那些类存在于两种应用程序之内 每一个AppDomain拥有它自己的静态字段的备份—数据并不共享 每一个应用程序的数据和代码安全独立存在并且在一边界之内由AppDomain提供 为了在AppDomain之间通讯或者在AppDomain之间交换对象 需要查看在 NET中穿过边界的通讯技术 例如 NET细微的或Web 服务 对将AppDomain作为边界思想的警告之一是ASP NET应用程序在默认情况下会带着充分的信任运行 充分信任的代码可以执行本地代码 并且本地代码可以本质地在进程之内的任何内容 需要运行带着部分信任执行应用程序来约束存取不完整的代码并且对安全的AppDomain验证所有代码 隐藏备份并且重新启动 一旦一个集合加载到一个AppDomain 没有办法从AppDomain集合的办法 不过 从一个进程中移除一个AppDomain是有可能的 如果将一个已更新的dll复制到一个应用程序的子目录中 从ASP NET的运行时间知道有新代码要执行 既然ASP NET不能将dll复制到已存在的AppDomain中 它就会起动一个新AppDomain 旧的应用程序域是 排水已停止 那就是 存在的需要被允许完成执行并且一旦它们执行完成AppDomain可以卸载 带有新代码的新的AppDomain就会开始并且开始所有的新请求 典型地说 当一个dll加载进一个进程时 进程对dll加锁并且不能对磁盘的上的文件进行覆盖 不过 AppDomain有一个众所周知的特点 隐藏复制那所有的允许保留在磁盘上的那些未被加锁的可替换的集合 运行时间对二进制子目录的带有Shadow Copy的ASP NET进行初始化 AppDomain将任何的加锁之前的dll从二进制子目录中拷贝到一个临时位置并且再将这些dll加载到内存 Shadow Copy允许没有将网页在线的情况下对所有在二进制子目录中的任何dll进行重写 熟练掌握Domain 应用程序域替换OS进程将为单独的 NET结点单元 一个可理解的应用程序域将会给你一个在ASP NET应用程序后的手工发生的概念 使用AppDomain类的CurrentDomain属性 可以检查关于代码正在运行的AppDomain的属性 包括我们在此文章中讨论的Shadow Copy lishixinzhi/Article/program/net/201311/11383

从 (Component Object Model) 时代到 D(Distributed ) 微软扮演了一个推动者的角色 如果说 提供了一个 Windows 平台上的对象通讯技术 并且逐渐成为应用程序之间彼此通讯及互动的技术主流 那么 D 则是解决了计算机的通信和互动技术 的着眼点是在于同一台计算机上不同应用程序之间的通讯需求 跨到另外一台计算机之外 就不是一开始 所设想到的领域 所幸跨程序的通讯和跨计算机的通讯差异仅在于通讯协议的处理 ( 也就是定位问题 ) 对于数据交换上型别差异的处理并不会因此而有区别 所以要让 的环境能更进一步延伸到跨计算机的领域 只要妥善解决计算机定位的需求 就有机会克服 同样幸运的是 在一开始的设计中完全不去碰触跨计算机的问题 使得要在 的架构之上再架上一层跨计算机的处理环境并不会去破坏到原本的架构 于是 的网络延伸版本 D(Distributed ) 就此出现 专责让 组件可以在网络环境下持续提供服务 D 最主要处理的是两个议题 第一个议题是网络通讯能力 第二个议题则是权限的问题 之前 是在同一台计算机中找特定的组件 而 D 则要更进一步去找网络上的某台计算机 之后沿用 的机制找到计算机上的组件 到了 NET 当中 跨计算机的问题同样也需要对应的技术进行处理 NET Remoting 就是一个对应于 D 的技术 它让存活在不同应用程序域 (AppDomain 一个 NET 中的新概念 ) 不同执行程序 以及不同计算机上的对象能够顺畅的进行沟通协作 在累积了长期以来分布式应用的经验之后 微软没有理由把东西设计的更难用 从某种意义来说 NET Remoting 提供了比过去更易于使用的开发架构 用来来支持跨计算机的沟通作业 省却开发人员建立分布式应用程序时必须花费的心力 不过这样一个 出色 的分布式应用应用框架并没有得到本来应该得到的 待遇 相对于 Java 的 RMI 而言 它更加简单同时保持设计方面的d性 同时摈弃了 D 的一些缺点 在对于一个前后端必须以有状态紧密结合方式进行互动作业 同时又期望呼叫和数据交换的动作上能以最有效的方式进行的环境而言 NET Remoting 是一个比较恰当的选择方案 可是问题在于微软本身对于 XML Web Services 的狂热推崇让 NET Remoting 迷失了本来属于它自己的阵地 也就是说 XML Web Services 的过火让 NET Remoting 忘记了自己应该承担的角色 于是在开发者眼中成为了一个 可有可无 的作品 至少对于很多开发人员而言 在需要创建分布式应用程序的时候首先考虑的是 XML Web Services 而在于企业内部应用 特别是在可以控制服务器和客户端平台的情况下(比如完全基于 NET 平台的应用) Web Service 因为效率等等各个方面的原因并无法体现出优势 从技术本身来讲 NET Remoting 是一个非常出色的架构 但在商业方面 这是一个失败 毕竟 设计一个出色的产品然后束之高阁难免 不像话 NET Remoting 恰恰是这个战略的牺牲品 虽然拥有与生俱来的优点 不过依然生不逢时 Enterprise Services 从一个很直接的感觉来说 Enterprise Services 只是对于 + 的一个包装 从使用方式和技术实现本身而言 和 VB 或者 VC 下使用 + 服务没有本质的区别 而更多的只是在于多了一层托管代码的包装 让 NET 开发人员能够比较顺利的使用这些服务的功能 相对于 J EE 平台上的应用服务器如 BEA 的 WebLogic IBM 的 WebSphere 或者开放源代码的 JBoss 微软是希望能够在企业级应用之中分一杯羹 可是因为先天不足的原因 在企业应用中需要的事务 负载平衡 故障转移等等技术中的表现不是那么尽如人意 至少缺乏非常清晰的应用服务器( Application Server )的概念 虽然微软不止一次的强调 *** 作系统本身就是一个应用服务器 一个 IT 信息的基础结构 但是从开发人员实际的使用来看 这是一个 晦涩难懂 的产品 虽然 NET Framework 改变了很多东西 但是作为企业级应用中最重要的支撑技术——事务和服务 并没有得到同等程度的发展 我想这个也就是很多大型企业应用目前不选择 NET 的一个理由吧 毕竟从 MTS —— + —— Enterprise Services 这一路走来微软始终不是提供一个非常透明的机制让开发人员去控制各个环节(可能和微软一贯以来的策略有关 只是关心最广泛的应用而不是最高端的应用) 而 NET 中的所谓企业服务 和竞争对手提供的相当的 EJB 还是有比较大的差距 这是一个日前的微软无法解决的软肋 Web Service 从一开始 微软就将其作为 重头戏 推出 并且饶有意思的增加了 XML 然后那个 XML Web Services 就成为了 NET 战略中一个非常重要的术语 就如微软的白皮书所言 Microsoft NET 是 Microsoft XML Web Services 平台 微软通过 NET 来改变现有的互联网络结构 Windows 正在走向过去 这样的宣传是在于希望各个子系统之间的通信完全基于 Web Service 那样的话 作为 Win 开发人员一直困扰的组建注册 分发等等一系列问题都能够得到解决 并且能够用更多的语言更多的平台去开发应用 一切皆是 Web Service 这是一个冒进的举动 至少对于 年以前的世界 而这四年以来 虽然 Web Service 有很多很多的优点可以让我们 歌功颂德 但是不是 万金油 比如一直称垢的性能和安全问题也阻碍了 Web Service 一统天下 于是其他分布式应用架构在特定的领域依然能够有自己的生存空间 这一次 微软高估了 Web Service 虽然目前的 NET 是实现 XML Web Services 最好的平台 Visual Studio NET 也提供了从上至下的包装 让开发人员完全可以不关心协议的底层实现 比如 SOAP 比如对象序列化 比如 WSDL 因为一切的一切都可以在 IDE 中自动完成 我们不否认因为 NET Web Service 从概念已经走进应用 而 WSE 的出台更加 Web Service 具备了互 *** 作能力 不过依然无法改变开发人员的观点 只有在企业外网应用集成或者内部异种平台整合的时候才能够体现出优势 在于需要高度响应和服务支持的应用方面 Web Service 只是一个臆造的神话 ASP NET 我们无法否认 这项技术对于开发人员而言是一个颠覆性的改变 从静态的 HTML 到 CGI 再到 ASP/JSP/PHP 时代 我们都必须去了解 HTML 了解 >

应用程序域:(Application Domain,简称App Domain)一组程序集的一个逻辑容器,进程中的一个逻辑分区。通常由运行时宿主创建和 *** 作。AppDomain唯一的作用就是进行隔离。

具体功能:

隔离,一个AppDomain中的代码创建的对象不能由另一个AppDomain中的代码直接访问。达到隔离应用程序的效果。当然如果要访问别的AppDomain中的内容,可以使用“按引用封送”或者“按值封送”的语义。

AppDomain可以卸载,但不能卸载单独的程序集或类型,只能卸载整个应用程序域。从而卸载包含在该AppDomain中的所有程序集。

AppDomain可以单独保护,AppDomain在创建后,会应用一个权限集,它决定了向这个AppDomain中运行的程序集授予的最大权限。从而保护宿主加载的代码不被破坏。

可以单独实施配置,AppDomain在创建后,会关联一组配置设置。这些设置主要影响CLR在AppDomain中加载程序集的方式。这些设置涉及搜索路径、版本重定向、卷影复制以及加载器优化。

程序

程序是为解决一个信息处理任务而预先编制的工作执行方案,是由一串CPU能够执行的基本指令组成的序列,每一条指令规定了计算机应进行什么 *** 作(如加、减、乘、判断等)及 *** 作需要的有关数据。

进程

进程指是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。

线程

线程是指线程是进程中的一个实体,是被系统独立调度和执行的基本单位。

管程

管程是指管程实际上是定义了一个数据结构和在该数据结构上的能为并发进程所执行的一组 *** 作,这组 *** 作能同步进程和改变管程中的数据。

关系

(1)作业是在较早的多道批处理系统中提出的,现代 *** 作系统基本没有这个概念。一般来说作业是可以包含多个程序或数据集,但至少有一个程序。怎么理解呢?个人任务程序和作业可以从功能的角度来理解。打个比方,今天班主任要求我们进行班级大扫除,这可以看做一个作业。而这个作业被我们分成擦窗户,洗地板等等,这些所谓的“子作业”可以看成是一个一个的程序。

(2)一个程序可以有多个进程,一个线程可以包含多个程序。前半句比较好理解,那上面那个例子来说,比如说实现擦窗户这个程序。有些人(资源)去准备好布(资源)和水(资源),供别人擦洗;有些人(资源)接布进程擦窗户。这便可以理解为实现这个程序功能的两个线程。而为什么又说一个线程可以包含多个程序?仔细看清楚是“包含”。其实便是在这个进程里面直接调用其他程序,也就是使用程序的功能。

(3)一个进程至少有一个线程 线程的划分尺度小于进程,多个线程共享进程内存。多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但 *** 作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。还是拿上面的例子来讲,实现擦窗户这个功能的程序创建了两个进程。需要的资源有:人、布、水。这些资源早在创建的时候就已经申请了。第一条进程“有些人(资源)去准备好布(资源)和水(资源),供别人擦洗“现在可以开辟多个线程来细化这个任务。可以叫其中一个人去打水,其中一个人负责洗布,其中一个人传递干净的布等,这便是一个个线程。而无论开辟多少个线程,使用的资源都是来自进程已申请的,无法脱离进程而独自存在。另外,线程之间是独立的,打水的,洗布的,传递的,只要自己干好自己的活,没有必然的相互依赖的关系。而且可以同时进行,这便是多线程的好处所在。

(4)而对于管程呢?通俗的理解就是”管理进程“。死锁问题的存在导致管程于1971年被Dijkstra提出,说道:把所有进程对某一种临界资源的同步 *** 作都集中起来,构成一个所谓的秘书进程。凡要访问该临界资源的进程,都需先报告秘书,由秘书来实现诸进程对同一临界资源的互斥使用。

管程由四部分组成:

1)管程内部的共享变量。

2)管程内部的条件变量。

3)管程内部并行执行的进程。

4)对于局部与管程内部的共享数据设置初始值的语句。

回到例子,上面说道两个进程中,有些人去准备布和水的工作,有些人要擦窗户。那么问题来了。准备布工作的人的名单中却写着准备水的人,那么问题来了,这个人到底该干吗?如果准备布工作要了这个人,这个人一直工作着,而准备水的工作一直等着他去做,那么就一直等着吗?更极端的情况下,这个一直在洗布就不去换水,这便是死锁的一个情形。没关系,此时班主任来了,看到在场的情形,他决定了此时这个人应该去干嘛,解决了用人冲突的问题,其作用类似管程。

线程是指进程内的一个执行单元,也是进程内的可调度实体

与进程的区别:

(1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;

(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源

(3)线程是处理器调度的基本单位,但进程不是

(4)二者均可并发执行

进程和线程都是由 *** 作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:[size=12px]

简而言之,一个程序至少有一个进程,一个进程至少有一个线程

线程的划分尺度小于进程,使得多线程程序的并发性高。

另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但 *** 作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源

一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行

应用程序域:

我们知道NET程序都是运行在托管环境(managed environment),但是 *** 作系统只提供了进程(Process),而进程呢又只是提供了内存的控制。所以我们创建的NET程序是无法直接在进程中运行的,那怎么办呢?这个时候应用程序域作为中介的角色出现了,它能够运行非托管进程和托管进程之上所以我们的WINFROM、WENFROM,控制台应用程序或是程序集都是运行在一个应用程序域中。

我们知道NET程序都是运行在托管环境(managed environment),但是 *** 作系统只提供了进程(Process),而进程呢又只是提供了内存的控制。所以我们创建的NET程序是无法直接在进程中运行的,那怎么办呢?这个时候应用程序域作为中介的角色出现了,它能够运行非托管进程和托管进程之上所以我们的WINFROM、WENFROM,控制台应用程序或是程序集都是运行在一个应用程序域中。

跨越Web应用程序。在JavaEE中,ServletContext对象的生命周期最长,它的作用域可以跨越整个Web应用程序。它在Web应用程序启动时创建在Web应用程序关闭时销毁。在整个Web应用程序的生命周期中,ServletContext对象都存在并且可以通过它来实现在整个应用程序中共享数据和资源。ServletContext对象是一个Web应用程序级别的对象,它可以被用来存储和共享Web应用程序范围内的数据和资源,比如数据库连接池、全局配置信息等。

1PhoneGap

它能提供一个很好的应用程序开发机制,开源并支持黑莓、Android、iOS、Symbian等7种 *** 作系统。该平台开发使用JavaScript和HTML5等Web编程语言,简单易用,因此开发成本非常低。

2WidgetPad

它支持使用HTML5、JavaScript和CSS3编写最新的智能设备应用程序。这个工具的显著特点是,它配备了源代码编辑、协作、调试和版本区分阵列。开发者可利用它为Android、iOS和webOS等很多不同的 *** 作系统开发不同应用。

3RhoMobile

这是一款深受开发人员欢迎的、可创建智能手机“本机应用程序”的跨平台开发工具。它为开发者提供了一个良好的开发环境,其开源的Rhodes编程框架,可让开发者只用HTML和Ruby就能开发Android、RIM、WindowsMobile、iPhone和Symbian等各种平台上的应用。

4SenchaTouch

使用该工具,可基于同一个用户界面开发黑莓、Android、Windows和iOS等系统应用程序。它为同一个域中的其他工具设置了统一的网络标准。此外,它提供的增强触摸事件和数据集成能力,也是软件的亮点之一。

5Titanium

这是一款全球公认的优秀跨平台开发工具,支持使用HTML、JavaScript等语言开发,同时也支持Ruby、PHP和Python。这款工具的最大吸引力在于,由于是基于硬件的开发,开发过程中所创建的应用程序可选择存储在设备上或者云端。

可以通过多种方式将

程序集

加载到

应用程序域

中。推荐方式是使用

System

Reflection

Assembly类的static(在

Visual

Basic

中为Shared)Load方法。加载程序集的其他方式包括:Assembly类的LoadFrom方法加载已给定其文件位置的程序集。通过此方法加载程序集将使用不同的加载上下文。

ReflectionOnlyLoad和ReflectionOnlyLoadFrom

将程序集加载到仅反射上下文中。

注意仅反射上下文是

NET

Framework

20

版中的新增功能。

诸如CreateInstance方法和AppDomain类的CreateInstanceAndUnwrap

之类的方法可将程序集加载到应用程序域中。

Type类的GetType方法可加载程序集。

SystemAppDomain类的Load方法可以加载程序集,但该方法主要用于

COM

互 *** 作性

。不应使用该方法将程序集加载到除从其调用该方法的应用程序域以外的其他应用程序域。

注意从

NET

Framework

20

版开始,对于版本号高于当前已加载运行库的

NET

Framework

版本,运行库将不加载由其进行编译的程序集。这同样适用于主版本号和次版本号的组合。

可以指定在应用程序域间共享来自已加载程序集的实时

(JIT)

编译代码的方式。有关更多信息,请参见

应用程序域和程序集。

示例下面的代码将名为exampleexe或exampledll的程序集加载到当前应用程序域中,从该程序集获取名为Example的类型,为该类型获取名为MethodA的无参数方法,然后执行该方法。有关从所加载程序集中获取信息的完整讨论,请参见动

态加载和使用类型。

以上就是关于ASP.NET程序员应用程序域须知全部的内容,包括:ASP.NET程序员应用程序域须知、.NET重要技术思考-DCOM 的技术、C#里的应用程序域“AppDomain”是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9449914.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存