程序集和应用程序域

.NET程序集用于解决DLL HELL(即与DLL相关的问题)。程序集是自我描述的逻辑单元,而非一个文件。程序集可以是包含元数据的文件,也可以是一个DLL或者EXE文件。总之,程序集是作为整体发布的.NET可执行程序或者是.NET可执行程序的一部分。

程序集分为私有程序集和共享程序集,私有程序集是创建.NET项目时默认的,私有程序集以可执行程序或者库的形式提供给应用程序,库中的代码只服务于这个应用程序。而共享程序集是一个公共库,可服务于系统的所有程序。共享程序集安装到.NET的特别目录下,而其他被服务的程序则不需要知道安装的地方。

PS:元数据Metadata),又称中介数据中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。(From百度百科)

任何.NET程序均由程序集组成,程序集是包含已编译的,面向.NET Framework的代码逻辑单元。当程序集存储于多个文件当中时,则一定有一个主文件包含程序集主程序的入口。一个进程内可以容纳多个应用程序集,这样,.NET中的应用程序域可使多个应用程序运行于同一个进程中,在没有代理的情况下,不同的应用程序域中的实例和静态成员无法共享,这样也保证了安全性。

展示程序集和应用程序域的简单应用。新建项目ApplicationA,在Program.cs中编写以下的代码:

namespace ApplicationA
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建AppDomain的current,用于引用AppDomain.CurrentDomain
            AppDomain current = AppDomain.CurrentDomain;
            //输出程序的应用程序域的名称
            Console.WriteLine("这是程序集A,我在的应用程序域是{0}",current.FriendlyName);
        }
    }
}

可见,当应用程序运行时,默认所在的应用程序域的名称就是程序名称。现在,ApplicationA已经编译了私有程序集,位于所在项目的Debug文件夹下。

新建项目ApplicationB,在Program.cs中写如下代码:

namespace ApplicationB
{
    class Program
    {
        static void Main(string[] args)
        {
            AppDomain current = AppDomain.CurrentDomain;
            Console.WriteLine("这是程序集B,我的基目录是{0},我所在的应用程序域的名称及上下文策略:{1}",current.BaseDirectory,current.ToString());
            current.ExecuteAssembly("ApplicationA.exe");
            Console.WriteLine("加载ApplicationA程序集");

            AppDomain after = AppDomain.CreateDomain("ROOM-A");
            after.ExecuteAssembly("ApplicationA.exe");

            Console.WriteLine("ApplicationA程序集的基目录:{0}\nApplicationA程序集所在的应用程序域的名称及上下文策略:{1}", after.BaseDirectory, after.ToString());
        }
    }
}

执行代码前,需要添加对ApplicationA的引用,这步的操作实际上是把Application程序集直接复制到ApplicationB 的相同目录下,这也充分反映了私有程序集的便捷性。这时候,ApplicationB执行时就可以把ApplicationA的程序集装载到新建的应用程序域了。

输出是这样:

可以看到A首先被装载到当前的应用程序域,然后被加载到名称为:“ROOM-A”的应用程序域,从任务管理器可以看到,A并没有新建进程。事实上,A的程序集已经加载到ApplicationB.exe进程中运行,这也就达到了多个应用程序在同一进程中运行的目的。

(请无视.vshost,我直接调试得到的截图,visual studio调试时打开的实际是ApplicationA.vshost.exe,这只是编译器为了调试方便,而实际上Debug目录下有个ApplicationA.exe)

时间: 2024-10-12 20:40:52

程序集和应用程序域的相关文章

C#中的程序集和命名空间

C#中的程序集和命名空间 如果说命名空间是类库的逻辑组织形式,那么程序集就是类库的物理组织形式.只有同时指定类型所在的命名空间及实现该类型的程序集,才能完全限定该类型.<精通.NET核心技术--原理与架构> 程序集和命名空间不存在必然联系,一个程序集可以包含多个命名空间,同一个命名空间也可以分放在几个程序集. 程序集是应用程序的部署单元..NET应用程序包含一个或多个程序集.通常扩展名是EXE或DLL 的.NET可执行程序称为程序集..NET程序集包含元数据,这些元数据描述了程序集中定义的所有

.net学习之泛型、程序集和反射

一.泛型1.CLR编译时,编译器只为MyList<T>类型产生“泛型版”的IL代码——并不进行泛型的实例化,T在中间只充当占位符.例如:MyList 类型元数据中显示的<T> 2.执行的时候,当JIT编译器第一次遇到MyList<int>时,将用int替换“范型版”IL代码与元数据中的T—进行泛型类型的实例化.例如 :Main函数中显示的<int> 3.什么是泛型泛型是具有占位符(类型参数)的类.方法.结构.接口 4.泛型类的继承public class F

asp.net mvc本地程序集和GAC的程序集冲突解决方法

一个从asp.net mvc 3升级到asp.net mvc 4的项目发生了如下错误: [A]System.Web.WebPages.Razor.Configuration.HostSection cannot be cast to [B]System.Web.WebPages.Razor.Configuration.HostSection. Type A originates from 'System.Web.WebPages.Razor, Version=1.0.0.0, Culture=n

应用程序集和CLR 垃圾回收(二)

本篇是整理蒋金楠对CLR 内存管理的博文,蒋大神的博文中将CLR 的内存分管理分为三个逻辑部分,博文中详细讲述了哪些程序集要加载到系统程序域,哪些要加载到共享程序域,以及我们写的代码会被加载到默认程序域.下面是我整理后的思路,目的是加强一下对CLR 内存管理的概念. 程序集与应用程序域 程序集是一个托管应用的基本的部署单元.一个程序集是子描述的(通过元数据),能够实施版本策略和部署策略.从结构组成来看,一个程序集主要由三个部署组成:IL指令.元数据和资源. 应用程序域从功能上看是,通过应用程序域

程序集和反射(C#)

这里我又唠叨几句,大家在学习的时候,如看书或者看视频时觉得非常爽,因为感觉基本都看得懂也都挺容易的,其实看懂是一回事,你自己会动手做出来是一回事,自己能够说出来又是另一回事了.应该把学到的东西变成自己的东西,而不是依样画瓢. 在说反射之前,我们先来了解一下什么是程序集? 程序集 程序集是.net中的概念,程序集可以看作是给一堆相关类打一个包,相当于java中的jar包. 程序集包含: 资源文件 类型元数据(描述在代码中定义的每一类型和成员,二进制形式) IL代码(这些都被封装在exe或dll中)

第九节:反序列化时重写程序集和类型

序列化对象时,格式化器输入类型及其定义程序集的全名.反序列化一个对象时,格式化器根据这个信息类准确的判断要为对象构造并初始化什么类型.前面,我们讨论了如何利用IserializationSurrogate接口接管一个特定的类型的序列化和反序列化.实现了IserializationSurrogate接口的类型与一个特定程序集中的特定类型关联在一起. 但在某些时候,IserializationSurrogate机制的灵活性显的差一些.在下面列举的情形中,有必要将一个类型反序列化成和序列化不同的一个类

菜鸟笔记 一、.net基础

C# 是一个现代的.通用的.面向对象的编程语言,它是由微软(Microsoft)开发的,由 Ecma 和 ISO 核准认可的.C# 是由 Anders Hejlsberg 和他的团队在 .Net 框架开发期间开发的.C# 是专为公共语言基础结构(CLI)设计的.CLI 由可执行代码和运行时环境组成,允许在不同的计算机平台和体系结构上使用各种高级语言. C#的优点现代的.通用的编程语言.面向对象.面向组件.容易学习.结构化语言.它产生高效率的程序.它可以在多种计算机平台上编译..Net 框架的一部

全面认识.NET框架(一)

重新学习下.NET框架,在这里将会对.net框架逐步的学.加深一下对.net的认识.如果那个地方有错误,希望大家能够指出来.谢谢. 知识有限,先逐步了解下.net包含的什么.我就是写写我目前想了解的内容.做下笔记.有的是从别的地方看到了.感觉不错就记下来了.   我们大家都知道,.NET框架是一个多语言组件开发和执行环境,它提供了一个跨语言的统一编程环境..NET框架的目的是便于开发人员更容易地建立Web应用程序和Web服务,使得Internet上的各应用程序之间,可以使用Web服务进行沟通.从

ASP.NET学习路线图(转)

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