应用程序域基础

我们都知道,进程是操作系统进行资源调度和分配的基本单位,每个进程实际代表了当前应用程序从启动到结束的全部过程。对于Windows中的每一个.exe文件,在运行时都要由一个进程来承载它。与非托管.exe文件不同的是,托管.exe文件并没有直接将程序集加载到当前进程当中,而是将程序集加载到应用程序域中,然后将应用程序域加载到进程中。每个进程可以承载多个应用程序域。因此,对于托管程序,每个进程可以承载多个应用程序,这同时也提升了应用程序的性能,因为进程的切换所耗费的性能要多于应用程序域的切换。

1.1 应用程序域的特点

托管程序为什么要使用应用程序域呢?概括其优点如下:

1. 在一个应用程序中出现的错误不会影响其他应用程序。

2. 因为类型安全的代码不会导致内存错误,所以使用应用程序域可以确保在一个域中运行的代码不会影响进程中的其他应用程序。

3. 能够在不停止整个进程的情况下停止单个应用程序。

4. 使用应用程序域时,可以卸载在单个应用程序中运行的代码。

5. 在一个应用程序中运行的代码不能直接访问其他应用程序中的代码或资源。

为了强制实施此隔离,公共语言运行库禁止在不同应用程序域中的对象之间进行直接调用。要在各域之间传递对象,可以通过复制这些对象,或通过代理访问这些对象。如果复制对象,那么对该对象的调用为本地调用。也就是说,调用方和被引用的对象位于同一应用程序域中。如果通过代理访问对象,那么对该对象的调用为远程调用。在此情况下,调用方和被引用的对象位于不同的应用程序域中。域间调用所采用的远程调用基础结构与两个进程间的调用或两台计算机间的调用的基础结构相同。因此,被引用的对象的元数据必须对于两个应用程序域均可用,以便用 JIT 正确编译该方法调用。如果调用域对被调用对象的元数据没有访问权,则编译可能失败,并引发类型为 System.IO.FileNotFound 的异常。

1. 代码行为的作用范围由它运行所在的应用程序决定。

换言之,应用程序域将提供应用程序版本策略等配置设置、它所访问的任意远程程序集的位置,以及加载到该域中的程序集的位置信息。

2. 向代码授予的权限可以由代码运行所在的应用程序域来控制。
1.2 创建应用程序域

.NET提供了相关的类和方法来获取当前应用程序域的基本信息,也提供了创建和配置应用程序域的成员。其中,AppDomain 类是应用程序域的编程接口,此类包括各种方法,这些方法可以创建和卸载域、创建域中各类型的实例以及注册各种通知(如应用程序域卸载)。对于应用程序域的卸载,将在第3.1.3节做介绍。

代码清单1-1演示了如何创建一个应用程序域。

代码清单1-1 创建应用程序域
class Program
   {

       static void Main(string[] args)

       {

          AppDomain myDomain= AppDomain.CreateDomain("xuanhunDomain");//创建名为xuanhunDomain的应用程序域
          Console.WriteLine("myDomain name is :{0}",myDomain.FriendlyName);//输出创建的程序域名称
          Console.WriteLine("当前程序域的名称是:{0}", AppDomain.CurrentDomain.FriendlyName);//输出当前程序域名称
          Console.ReadKey();

       }

   }

输出结果如图1-1所示。

图1-1 输出应用程序域名称

时间: 2024-12-23 07:29:53

应用程序域基础的相关文章

《敏捷制造——敏捷集成基础结构设计》——2.3 集成基础结构数据访问模型

2.3 集成基础结构数据访问模型 2.3.1 集成基础结构数据存储结构建模分析 敏捷企业的集成基础结构中计算机系统的主要用途之一便是从数据存储检索数据并将信息显示给用户:在用户更改数据之后系统再将更新内容存入数据库.由于数据存储和用户界面之间的数据流是关键的信息流,因此以往更倾向于将这两部分功能程序捆绑在一起.这样虽然可以减少编码量,但用户界面需要频繁地更改,数据与界面的捆绑使用户界面的更改往往伴随着许多逻辑指令的更改,为此程序工作者平添了诸多不便. Model-View-Controller(

asp.net学习中发现的比较完整的流程_基础应用

如果你已经有较多的面向对象开发经验,跳过以下这两步:  第一步 掌握一门.NET面向对象语言,C#或VB.NET 我强烈反对在没系统学过一门面向对象(OO)语言的前提下去学ASP.NET. ASP.NET是一个全面向对象的技术,不懂OO,那绝对学不下去!  第二步 对.NET Framework类库有一定的了解 可以通过开发Windows Form应用程序来学习.NET Framework.ASP.NET是建构在.NET Framework之上的技术,你对.NET Framework了解得越深,

一起谈.NET技术,WPF 基础到企业应用系列4——WPF千年轮回

1.开篇前言      首先很高兴这个系列能得到大家的关注和支持,基于对大家负责和对自己负责的态度,我会不断努力写好这个系列,分享自己的微薄技术和经验,希望在帮助别人的同时也不断提升自己.由于这篇文章很多(现已拆分成2篇,今天这篇只是其中之一),一共花了几个个晚上的休息时间才完成,所以读者花的时间长了一些,也希望大家能够见谅,这个系列以后会每周发三到四篇左右(主要是写一篇差不多要花几晚上,感觉思维比较发散),除了讲WPF技术本身之外,也会讲一些项目具体开发,所以敬请关注.     本篇文章取名为

一起谈.NET技术,2010 .NET面试题整理之基础篇

开篇语:对于已有工作经验的朋友,也许面试题已显得不怎么重要,但是如果你应聘的还仅仅是个普通的程序员,相信在很多的公司都还是会先拿出一套面试题,可能对整个面试影响不大,但做好面试题无疑会赢得第一个好的印象,特别对于那些缺少项目经验的应届毕业生.很多时候,在看这些面试题的时候,是否有感过曾经那些一个个不起眼的小程序题所针对的问题正是自己在项目中所犯的错误?是否会发现,原来还有这么多东西自己都还从未去想过?趁自己这次重新找工作之际,对常见面试题进行进行一次重新整理,与大家共同学习!本贴将会进行不断完善

2010 .NET面试题整理之基础篇

开篇语:对于已有工作经验的朋友,也许面试题已显得不怎么重要, 但是如果你应聘的还仅仅是个普通的程序员,相信在很多的公司都还是会先拿出一套面试题,可能对整个面试影响不大,但做好面试题无疑会赢得第一个好的印象,特别对于那些缺少项目经验的应届毕业生.很多时候,在看这些面试题的时候,是否有感过曾经那些一个个不起眼的小程序题所针对的问题正是自己在项目中所犯的错误?是否会发现,原来还有这么多东西自己都还从未去想过?趁自己这次重新找工作之际,对常见面试题进行进行一次重新整理,与大家共同学习!本贴将会进行不断完

xcode-学习objective-c 基础教程遇到问题 例题03.06 word-length-3 编译出错

问题描述 学习objective-c 基础教程遇到问题 例题03.06 word-length-3 编译出错 #import int main(int argc, const char * argv[]) { FILE *wordFile = fopen ("/tmp/words.txt", "r"); char word[100]; while (fgets(*word,99,wordFile)) \这一行编译出现"Thread 1:EXC_BAD_AC

零基础如何自学UI设计?

  酸梅干超人:下面是我这几年经验的总结和思考,虽然我并不算是最出类拔萃的UI设计师,但也希望对新人有益. 第一点:学习准备--启蒙 学习一项技能,尤其是已经有一定沉淀并在各行各业有广泛应用的技能,就一定要对它先有充分的认知.在开始正式学习前,你需要花足够的经历去了解和查阅它的起源.发展.应用.未来.UI作为平面设计的一部分,再往上又从属与美术学这一大类.因此,首先要先去了解整个美术史的发展.从人类起源各个阶段中,美术经历了什么样的变化,在各自的时代发挥了什么作用,近代美术史又经历了哪些波折,平

.NET 2.0 基础类库中的范型——其他范型类

其他范型类.NET 2.0 基础类库对范型的应用当然并不仅限于范型集合和 Functional Programming.下面所列的范型类也都有其明确的设计目的和用途. Array在.NET 2.0中,Array 类扩充了对范型编程的支持.当然,Array类本身并不是范型类(出于兼容的考虑),而是提供了一系列支持范型的方法.除了前面提到的 Functional Programming 的支持外,Array 类还对以前很多基于 object 的方法提供了对应的范型版本,这样对值类型可以提高查找和排序

Grand Central Dispatch(GCD)编程基础

有过编程经验的人,基本都会接触到多线程这块. 在java中以及Android开发中,大量的后台运行,异步消息队列,基本都是运用了多线程来实现. 同样在,在ios移动开发和Android基本是很类似的一种模型. 但是很多时候,在应用开发中,我们会发现本身并没有自己编码去处理一些并发的事件,去开辟新的子线程等等. (虽然一般的调用sdk发起一个网络请求,系统都是会默认给你新起一个线程去处理的). 整个程序看上去基本就是在Main线程中执行. 确实也是这样的一种现象,因为我们基本都是在操作控件的布局,