应用程序域进一步认识

新知识点:

  • 一个AppDomain中创建的对象不能由另一个AppDomain的代码进行访问,必须进行特殊的声明,使用特殊的跨域调用;
  • AppDomain 可以单独配置;
  • 每个AppDomain都有自己的Loader堆,记录自AppDomain创建以来,访问过哪些类型,每个类型对象都有一个方法表,指向JIT编译的本地代码;

运行示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Reflection;
using System.Runtime.Remoting;

namespace FactoryMode
{
    [Serializable]
    public class Program : MarshalByRefObject
    {
        //在调用此方法时,观察"调用堆栈",发现一次"外部代码"的切换,表明自进行了一次跨域操作
        public void NotMainMethod()
        {
            //AppDomain.CurrentDomain 可以得到同样的结果
            var curCallingDomain = Thread.GetDomain(); 

            var curCallingDomainName = curCallingDomain.FriendlyName;
            Console.WriteLine("Cross-domain calling, curdomain name={0}.", curCallingDomainName);
        }

        static void Main(string[] args)
        {
            var curCallingDomain = Thread.GetDomain();

            var curCallingDomainName = curCallingDomain.FriendlyName;
            Console.WriteLine("Default AppDomain‘s friendly name={0}.", curCallingDomainName);

            string exeAssembly = Assembly.GetExecutingAssembly().CodeBase;
            Console.WriteLine("Main assembly={0}.", exeAssembly);

            AppDomain otherDomain = null;
            Console.WriteLine("{0}Demo #1", Environment.NewLine);

            otherDomain = AppDomain.CreateDomain("AD #2", null, null);
            //在"AD#2"应用程序域中创建 Programs 对象,并向默认应用程序域返回它的引用;
            var mbrt = (Program)otherDomain.CreateInstanceFromAndUnwrap(exeAssembly, "FactoryMode.Program");
            Console.WriteLine("Type={0}", mbrt.GetType());
            Console.WriteLine("Is proxy={0}", RemotingServices.IsTransparentProxy(mbrt));

            //利用引用调用方法,方法中的打印显示出此时线程正运行在"AD#2"应用程序域中
            mbrt.NotMainMethod();

            Console.Read();

        }
    }
}
  • 进行跨域封送,必须支持序列化;
  • 例子展示了跨域的引用传递,另外还有值传递;
  • AppDomain 的构造 AppDomainSetup 参数决定了是否使用单独的配置;

卸载AppDomain:

  • 挂机进程中执行过托管代码的所有线程;
  • 检查正在该AppDomain上运行的线程,与会返还到该AppDomain上运行的线程;
  • 抛出 ThreadAbortException,执行所有 finally 块中的内容进行资源清理;
  • 在公共堆中遍历已卸载AppDomain中的对象,进行标记后进行垃圾回收;
  • 恢复剩余所有线程的执行;

监视AppDomain:

  非常好用的功能,可以用来做资源监控,性能监测;

  • MonitoringSurvivedProcessMemorySize: 静态属性,当前 CLR 控制的所有 AppDomain 正在使用的字节数;
  • MonitoringTotalAllocatedMemorySize: 实例属性,返回特定的 AppDomain 已分配的字节数;
  • MonitoringSurvivedMemorySize: 实例属性,返回特定的 AppDomain 正在使用的字节数;
  • MonitoringTotalProcessorTime: 实例属性,返还特定的 AppDomain 的CPU占用率;
时间: 2025-01-14 00:54:18

应用程序域进一步认识的相关文章

.Net知识梳理---(踏踏实实学好.Net系列)

应用程序域,你真的了解吗?它可以干什么? 说到应用程序域Appdomain,我们必须要知道的知识就是进程,那么到底什么是进程呢?你不妨问问自己,怎么给进程下一个定义.到这里,我先卖个关子,你自己先想. 我们先来看一下win7中的进程: 有很多进程是吧,每一个进程都像是在执行者一个程序,或是监听或是执行或是空闲.这也是windows系统中的一个基本概念,它拥有一个运行着的程序所需要的系统资源比如分配内存.而且聪明的你一定试过,当你强行终止一个进程的时候,其他进程不会都跟着消亡,而且进程间是无法互相

对进程、线程、应用程序域的理解

前几天面试的一道题是谈谈进程.线程.应用程序域的区别,虽然能说上来几点,但感觉理解的很肤浅.很不透彻,闲暇时从书箱里翻出尘封已久的<操作系统>(还好,毕业时偶没舍得卖),翻了翻进程的那一章.看之前我列出了下面三个问题:1. 这些概念(技术)出现的背景以及要解决的问题 (要干什么)2. 它们之间的联系与区别3. 三者之间的发展脉络 进程的出现:(复习功课嘛,就把相关的内容都看看了,哎,都忘的差不多了)  进程由操作系统创建.管理的,离开了操作系统也就不谈什么进程了,先看看操作系统的四个基本特征:

进程(process)线程(thread)应用程序域(domain) (from www.sysoft.cc)

进程(process)是windows的一个基本概念,它包括了运行一个程序的需要的所有资源.进程之间是相互独立的,一个进程无法访问另一个进程之间的数据(除非采用分步式计算方式),一个进程运行的失败也不会影响到另一个进程的运行.windows就是利用进程将工作划分为多个工作区域的.进程可以理解为一个程序 的基本边界.解决问题:要解决并发问题,即:使进程独立,就要使每个进程有属于自己的程序段,数据段,进程控制块. 应用程序域(domain),它提供安全通用的处理单元,公共语言运行库可以用它来进行应用

进程、线程与应用程序域的区别

1 进程 1.1 四个基本特征 进程由操作系统创建.管理的,离开了操作系统也就不谈什么进程了,先看看操作系统的四个基本特征: 并发(concurrence) 并行性是指两个或者多个事件在同一时刻发生,这是一个具有微观意义的概念,即在物理上这些事件是同时发生的:而并发性是指两个或者多个事件在同一时间的间隔内发生,它是一个较为宏观的概念.在多道程序环境下,并发性是指在一段时间内有多道程序在同时运行,但在单处理机的系统中,每一时刻仅能执行一道程序,故微观上这些程序是在交替执行 的.应当指出,通常的程序

程序集与应用程序域基础练习

1. 程序集 程序集是自我描述的安装单位. 程序集清单:描述了程序集和引用它所需要的所有信息. 查看程序集:ildasm 工具 程序集特性:VS会生成 AssemblyInfo.cs 文件,描述程序集特性,用于配置程序集清单. 用“C#”高级编程的例子来学习创建与动态加载程序集: public class CodeDriver { private string prefix = "using System;" + "public static class Driver&quo

进程、线程与应用程序域

进程.线程与应用程序域 2015-06-15 目录 1 进程  1.1 四个基本特征  1.2 进程的出现  1.3 进程的定义和特征  1.4 关于进程的总结 2 线程  2.1 线程的出现  2.2 关于线程的总结3 应用程序域(AppDomain)  3.1 应用程序域的出现  3.2 域与线程的关系  3.3 示例:在另一个应用程序域中执行代码参考: 1 进程 返回 1.1 四个基本特征 进程由操作系统创建.管理的,离开了操作系统也就不谈什么进程了,先看看操作系统的四个基本特征: 并发(

WinDbg探究CLR底层(1) - 应用程序域

一.什么是应用程序域 操作系统由于其稳定性与可靠性的要求,都会使用隔离层,来确保运行在某个隔离层内的代码不会对其他隔扇层的代码产生影响.如Windows通过进程来实现这种隔离机制,所能的可执行代码.数据.以及其它资源都被包含在进程中,系统其他进程通常不允许对它们进行访问.同理..NET应用程序同样也是被局限在进程内执行,但是.NET还进一步引入了另一种逻辑隔离层,也就是我们这里说的应用程序域(AppDomain). 二.如何查看应用程序域 下面用一个例子看看应用程序域: using System

aync await 进一步探索

aync await 进一步探索 首先来个例子 class Program { static int index = 1; static void Log(string str) { Console.WriteLine((index++) + ". " + str + ". ThreadId:" + Thread.CurrentThread.ManagedThreadId); } static void Main(string[] args) { //解决.net

NET对象的跨应用程序域

NET对象的跨应用程序域 转眼就到了元宵节,匆匆忙忙的脚步是我们在为生活奋斗的写照,新的一年,我们应该努力让自己有不一样的生活和追求.生命不息,奋斗不止.在上篇博文中主要介绍了.NET的AppDomain的相关信息,在本篇博文中将会主要说明.NET程序集.对象代理,以及对象的封送原理. 一.程序集解析: 谈到程序集,就要知道什么叫做程序集,我们看看程序集的定义是什么.程序集大致分为两种:一种是类库(就是我们看到的.DLL文件):一种是可执行程序(就是我们看到的.EXE文件).程序集是一个或多个模