应用程序域

应用程序域

在进行学习asp.net内容之前,需要了解一下应用程序域的相关内容。处理asp.net所涉及的类大多数定义在System.Web程序集中。在.Net中,管理程序集的最小逻辑单元为应用程序域(AppDomain)。对于.Net程序来说可以动态的加载程序集到应用程序域中。但是,加载之后的程序集不能单独卸载,只能以应用程序域为单位来整体卸载。

应用程序域四个机制:

隔离:不同应用程序域之间不能直接访问。跨应用程序域访问的对象必须派生自System.MarshalByRefObject。

卸载:被加载的程序集只能以应用程序域为单位卸载。

安全:以应用程序域为边界的安全机制。

配置:以应用程序域为边界的程序配置。

asp.net将网站应用程序寄宿在一个独立的应用程序域中,以便管理。虽然可以通过System.AppDomain也可创建自定义的应用程序域,但,asp.net在System.Web.Hosting命名空间中定义了更加方便的辅助类,以协助程序员寄宿web服务器程序所涉及的应用程序域,并设置应用程序域的相关参数。

由于我们的应用程序域将于web应用程序运行在不同的应用程序域中,这就涉及到了跨域访问问题。在.Net中,跨域访问的类必需派生自System.MarshalByRefObject。通过这种方式,我们可以得到一个远程对象的代理对象,通过该对象访问位于web应用程序域中的对象。

web应用程序域

 ApplicationHost.CreateApplicationHost静态方法可以很方便的创建web应用程序所需的应用程序域,并设置所需要的参数。

namespace System.Web.Hosting
{
    // Summary:
    //     Enables hosting of ASP.NET pages outside the Internet Information Services
    //     (IIS) application. This class enables the host to create application domains
    //     for processing ASP.NET requests.
    public sealed class ApplicationHost
    {
        // Summary:
        //     Creates and configures an application domain for hosting ASP.NET.
        //
        // Parameters:
        //   hostType:
        //     The name of a user-supplied class to be created in the new application domain.
        //
        //   virtualDir:
        //     The virtual directory for the application domain; for example, /myapp.
        //
        //   physicalDir:
        //     The physical directory for the application domain where ASP.NET pages are
        //     located; for example, c:\mypages.
        //
        // Returns:
        //     An instance of a user-supplied class used to marshal calls into the newly
        //     created application domain.
        //
        // Exceptions:
        //   System.PlatformNotSupportedException:
        //     The Web host computer is not running the Windows NT platform or a Coriolis
        //     environment.
        public static object CreateApplicationHost(Type hostType, string virtualDir, string physicalDir);
    }
}

hostType:表示用来跨域访问的通信对象,它必须派生自System.MarshalByRefObject。

virtualDir:表示网站应用程序的根所对应的虚拟目录。

physicalDir:表示网站应用程序所在的文件系统的文件目录。

注意

这个方法需要创建一个新的应用程序域,这个应用程序域将重新加载hostType。并按照以下顺序寻找定义hostType类型的程序集:

1.GAC

2.网站物理文件目录下的bin文件夹。

所以,如果没有将定义hostType的程序集经过数字签名,并加载到GAC中,那么,必需在网站应用程序所在的文件夹下创建bin文件夹,然后将定义hostType的程序集复制到bin文件夹中。

  System.Type hostType = typeof(Intelligencer);
            Intelligencer intelligencer = System.Web.Hosting.ApplicationHost.CreateApplicationHost(hostType, "/", System.Environment.CurrentDirectory) as Intelligencer;
            Console.WriteLine("current domain id:{0}",AppDomain.CurrentDomain.Id);
            Console.WriteLine(intelligencer.Report());
  public class Intelligencer : System.MarshalByRefObject
    {
        public string Report()
        {
            System.AppDomain appDomain = System.AppDomain.CurrentDomain;
            StringBuilder sb = new StringBuilder();
            //应用程序域的信息
            sb.AppendFormat("Domain id:{0}\r\n", appDomain.Id);
            //对于每一个web应用程序域,都有一个HostingEnviroment
            sb.AppendFormat("virtualpath:{0\r\n}", HostingEnvironment.ApplicationVirtualPath);
            sb.AppendFormat("ApplicationPhysicalPath:{0}\r\n", HostingEnvironment.ApplicationPhysicalPath);
            return sb.ToString();
        }
    }

博客地址: http://www.cnblogs.com/wolf-sun/
博客版权: 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。
如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!
再次感谢您耐心的读完本篇文章。http://www.cnblogs.com/wolf-sun/p/5193734.html
时间: 2024-10-31 10:25:56

应用程序域的相关文章

as3.0中通过ApplicationDomain类获得被加载应用程序域

首先先回顾一下FLASH的OO构成.对于FLASH,我们可以把任何的可视化元件都看成某个类文件的具体实例,包括swf文件.我们可以把swf文件看成一个类的具体实例,而它里面拥有个个其他类的实例对象,例如:我们新建一个loaded.fla文件,然后我们建立一个影片剪辑元件,你可以在它的内部做一些动画处理,打开库 ,单击元件右建,选择"链接"打开"链接属性",在类的输入框里我们键入"myClass".这样一来我们就可以把这个元件作为一个类--myCl

在指定应用程序域中执行代码

程序|执行 超级入门级:) 哈哈~ 留个纪念.//// 在指定应用程序域中执行代码////// using System;using System.Collections.Generic;using System.Text; namespace DomainTest{    class Program    {        private static string strKey = "Key1";         static void Main(string[] args)   

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

asp.net|程序|程序员 本文将讨论.NET的应用程序域,并且它们是如何对ASP.NET的执行和调度产生影响的. 当在Windows中启动Notepad程序时,众所周知程序会执行一个包含在容器内的进程.可以启动多个Notepad的实例,并且每个实例都会在一个专注的进行程运行.使用任务管理器,可以看到在系统中当前运行的所有进程的清单. 一个进程包括可执行从操作系统中保留的在内存中的代码和程序数据.在进程之内只少有一个包含在进程之内的正在执行指令的线程,并且在多数情况下有多个线程.如果程序打开了

应用程序域基础

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

【插件式框架探索系列】应用程序域(AppDomain)

应用程序域(AppDomain)已经不是一个新名词了,只要熟悉.net的都知道它的存在,不过我们还是先一起来重新认识下应用程序域吧,究竟它是何方神圣. 应用程序域 众所周知,进程是代码执行和资源分配的最小单元,每个进程都拥有独立的内存单元,而进程之间又是相互隔离的,自然而然,进程成为了代码执行的安全边界. 一个进程对应一个应用程序是一个普遍的认知,而.net却打破了这一惯例,因为它带来了应用程序域这一全新的概念,CLR可使用应用程序域来提供应用程序之间的隔离,而一个进程中可以运行多个应用程序域,

Asp.Net IIS中一个站点只有一个应用程序域么?

问题描述 Asp.Net IIS中一个站点只有一个应用程序域么? 如果很多个用户访问该站点,那么如何区分不同用户之间的HttpContext对象呢? 解决方案 一个站点只能有一个,区分用户通过session判断 解决方案二: 一个站点可以有多个应用程序域啊 解决方案三: 一个ASP.NET的IIS的完整控制类在一个IIS中使用ASP.Net 1.1和ASP.Net 2.0的应用

.Net的 AppDomain 没有达到MS所宣传的核心功能:“使用应用程序域隔离可能终止进程的任务。” ;难道是我错了?

问题描述 这是MSDN上的关于AppDomain的功能帮助说明:"应用程序域(由AppDomain对象表示)为执行托管代码提供隔离.卸载和安全边界.使用应用程序域隔离可能终止进程的任务.如果正在执行任务的AppDomain的状态变得不稳定,则可以卸载AppDomain,但不会影响进程.如果程序集被加载到默认应用程序域中,则当进程运行时将无法从内存中卸载该程序集."我的问题:我当前的系统中有几个功能相对独立的组件,但它们长时间运行后总会由于某一个组件出现无法捕获的异常而导致应用崩溃.根据

C#怎么样把另一个应用程序域的Form窗口作为当前应用程序域中MDI窗口容器的子窗口

问题描述 简单的说,就是当前默认的应用程序域中把一个窗口作为MDI窗口容器,显然,对当前应用程序域的其他窗口,可以通过简单的设置变成该窗口容器的MDI子窗口.但是,我的开发中需要创建一个应用程序域,让新建的应用程序域加载了一个程序集(比如叫A.exe的.Net程序集),其中A.exe是有自己的窗口界面的.我现在想把A.exe的界面作为当前应用程序域窗口容器的一个MDI子窗口,应该怎么做.因为跨越了应用程序域后,对象并不能直接访问.求高人指点. 解决方案 解决方案二:MAF方面,有关于以上问题相关

.NET的应用程序域

问题描述 关于应用程序域,可不可以这样理解:把软件A放到软件B里运行,这里软件A作为软件B的一个应用程序域.软件B运行两个应用程序域一个是软件A一个是软件B本身如果不是这样,那该如何理解? 解决方案