zoukankan      html  css  js  c++  java
  • 程序集和应用程序域

    .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}
    ApplicationA程序集所在的应用程序域的名称及上下文策略:{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)

  • 相关阅读:
    浅谈Linux进程
    POJ 1426 Find The Multiple
    JS JavaScript闭包和作用域
    JS JavaScript深拷贝、浅拷贝
    JS JavaScript中的文档碎片 DocumentFragement JS性能优化
    前端DOM知识点
    JS JavaScript中的this
    JS JavaScript实现杨辉三角
    JS JavaScript事件循环机制
    ES6基本语法
  • 原文地址:https://www.cnblogs.com/mengnan/p/4811534.html
Copyright © 2011-2022 走看看