认识AppDomain类
原文:认识AppDomain类
表示应用程序域,它是一个应用程序在其中执行的独立环境。
创建新的 AppDomain,在该新建 AppDomain 中实例化类型,以及与该类型的对象通信。
usingnbsp;System;usingnbsp;System.Reflection;usingnbsp;System.Threading;classnbsp;Module1{nbsp;nbsp;nbsp;nbsp;publicnbsp;staticnbsp;voidnbsp;Main()nbsp;nbsp;nbsp;nbsp;{nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;//nbsp;得到应用程序域名称nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;stringnbsp;callingDomainNamenbsp;=nbsp;Thread.GetDomain().FriendlyName;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;Console.WriteLine(callingDomainName);nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;//nbsp;得到应用程序域全名nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;stringnbsp;exeAssemblynbsp;=nbsp;Assembly.GetEntryAssembly().FullName;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;Console.WriteLine(exeAssembly);nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;//nbsp;构造一个新的应用程序域nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;AppDomainSetupnbsp;adsnbsp;=nbsp;newnbsp;AppDomainSetup();nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;ads.ApplicationBasenbsp;=nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;"file:///"nbsp;+nbsp;System.Environment.CurrentDirectory;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;ads.DisallowBindingRedirectsnbsp;=nbsp;false;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;ads.DisallowCodeDownloadnbsp;=nbsp;true;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;ads.ConfigurationFilenbsp;=nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;//nbsp;创建应用程序域nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;AppDomainnbsp;ad2nbsp;=nbsp;AppDomain.CreateDomain("ADnbsp;#2",nbsp;null,nbsp;ads);nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;MarshalByRefTypenbsp;mbrtnbsp;=nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;(MarshalByRefType)nbsp;ad2.CreateInstanceAndUnwrap(nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;exeAssembly,nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;typeof(MarshalByRefType).FullNamenbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;);nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;mbrt.SomeMethod(callingDomainName);nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;AppDomain.Unload(ad2);nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;trynbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;{nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;mbrt.SomeMethod(callingDomainName);nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;Console.WriteLine("Sucessfulnbsp;call.");nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;}nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;catch(AppDomainUnloadedException)nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;{nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;Console.WriteLine("Failednbsp;call;nbsp;thisnbsp;isnbsp;expected.");nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;}nbsp;nbsp;nbsp;nbsp;}}publicnbsp;classnbsp;MarshalByRefTypenbsp;:nbsp;MarshalByRefObject{nbsp;nbsp;nbsp;nbsp;publicnbsp;voidnbsp;SomeMethod(stringnbsp;callingDomainName)nbsp;nbsp;nbsp;nbsp;{nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;AppDomainSetupnbsp;adsnbsp;=nbsp;AppDomain.CurrentDomain.SetupInformation;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;Console.WriteLine("AppName={0},nbsp;AppBase={1},nbsp;ConfigFile={2}",nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;ads.ApplicationName,nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;ads.ApplicationBase,nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;ads.ConfigurationFilenbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;);nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;Console.WriteLine("Callingnbsp;fromnbsp;'{0}'nbsp;tonbsp;'{1}'.",nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;callingDomainName,nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;Thread.GetDomain().FriendlyNamenbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;);nbsp;nbsp;nbsp;nbsp;}}/*nbsp;Thisnbsp;codenbsp;producesnbsp;outputnbsp;similarnbsp;tonbsp;thenbsp;following:nbsp;AppDomainX.exeAppDomainX,nbsp;Version=1.0.0.0,nbsp;Culture=neutral,nbsp;PublicKeyToken=nullAppName=,nbsp;AppBase=C:\AppDomain\bin,nbsp;ConfigFile=C:\AppDomain\bin\AppDomainX.exe.configCallingnbsp;fromnbsp;'AppDomainX.exe'nbsp;tonbsp;'ADnbsp;#2'.Failednbsp;call;nbsp;thisnbsp;isnbsp;expected.nbsp;*/
nbsp;
nbsp;
nbsp;
[Serializable]publicnbsp;classnbsp;MyType{nbsp;nbsp;nbsp;publicnbsp;intnbsp;i;}//传递数据publicnbsp;classnbsp;Program{nbsp;nbsp;nbsp;publicnbsp;staticnbsp;voidnbsp;Test()nbsp;nbsp;nbsp;{nbsp;nbsp;nbsp;nbsp;nbsp;AppDomainnbsp;domainnbsp;=nbsp;AppDomain.CurrentDomain;nbsp;nbsp;nbsp;nbsp;nbsp;MyTypenbsp;tnbsp;=nbsp;domain.GetData("arg")nbsp;asnbsp;MyType;nbsp;nbsp;nbsp;nbsp;nbsp;Console.WriteLine("[{0}]nbsp;{1}",nbsp;domain.FriendlyName,nbsp;t.i);nbsp;nbsp;nbsp;nbsp;nbsp;ifnbsp;(domain.FriendlyNamenbsp;==nbsp;"NewDomain")nbsp;t.inbsp;=nbsp;1000000000;nbsp;nbsp;nbsp;}nbsp;nbsp;nbsp;staticnbsp;voidnbsp;Main()nbsp;nbsp;nbsp;{nbsp;nbsp;nbsp;nbsp;nbsp;AppDomainnbsp;ndomainnbsp;=nbsp;AppDomain.CreateDomain("NewDomain");nbsp;nbsp;nbsp;nbsp;nbsp;MyTypenbsp;tnbsp;=nbsp;newnbsp;MyType();nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;AppDomain.CurrentDomain.SetData("arg",nbsp;t);nbsp;nbsp;nbsp;nbsp;nbsp;ndomain.SetData("arg",nbsp;t);nbsp;nbsp;nbsp;nbsp;nbsp;t.inbsp;=nbsp;13;nbsp;nbsp;nbsp;nbsp;nbsp;Test();nbsp;nbsp;nbsp;nbsp;nbsp;ndomain.DoCallBack(newnbsp;CrossAppDomainDelegate(Test));nbsp;nbsp;nbsp;nbsp;nbsp;Test();nbsp;nbsp;nbsp;}}
nbsp;
nbsp;
远程对象调用
publicnbsp;classnbsp;MyType:nbsp;MarshalByRefObjectnbsp;{nbsp;nbsp;nbsp;publicnbsp;intnbsp;i;}publicnbsp;classnbsp;Program{nbsp;nbsp;nbsp;publicnbsp;staticnbsp;voidnbsp;Test()nbsp;nbsp;nbsp;{nbsp;nbsp;nbsp;nbsp;nbsp;AppDomainnbsp;domainnbsp;=nbsp;AppDomain.CurrentDomain;nbsp;nbsp;nbsp;nbsp;nbsp;MyTypenbsp;tnbsp;=nbsp;domain.GetData("arg")nbsp;asnbsp;MyType;nbsp;nbsp;nbsp;nbsp;nbsp;Console.WriteLine("[{0}]nbsp;{1}",nbsp;domain.FriendlyName,nbsp;t.i);nbsp;nbsp;nbsp;nbsp;nbsp;ifnbsp;(domain.FriendlyNamenbsp;==nbsp;"NewDomain")nbsp;t.inbsp;=nbsp;1000000000;nbsp;nbsp;nbsp;}nbsp;nbsp;nbsp;staticnbsp;voidnbsp;Main()nbsp;nbsp;nbsp;{nbsp;nbsp;nbsp;nbsp;nbsp;AppDomainnbsp;ndomainnbsp;=nbsp;AppDomain.CreateDomain("NewDomain");nbsp;nbsp;nbsp;nbsp;nbsp;MyTypenbsp;tnbsp;=nbsp;newnbsp;MyType();nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;//nbsp;或者使用下列代码在ndomain上创建MyType对象。nbsp;nbsp;nbsp;nbsp;nbsp;//nbsp;stringnbsp;assemblyNamenbsp;=nbsp;Assembly.GetExecutingAssembly().FullName;nbsp;nbsp;nbsp;nbsp;nbsp;//nbsp;stringnbsp;typeNamenbsp;=nbsp;typeof(MyType).FullName;nbsp;nbsp;nbsp;nbsp;nbsp;//nbsp;MyTypenbsp;tnbsp;=nbsp;ndomain.CreateInstanceAndUnwrap(assemblyName,nbsp;typeName)nbsp;asnbsp;MyType;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;AppDomain.CurrentDomain.SetData("arg",nbsp;t);nbsp;nbsp;nbsp;nbsp;nbsp;ndomain.SetData("arg",nbsp;t);nbsp;nbsp;nbsp;nbsp;nbsp;t.inbsp;=nbsp;13;nbsp;nbsp;nbsp;nbsp;nbsp;Test();nbsp;nbsp;nbsp;nbsp;nbsp;ndomain.DoCallBack(newnbsp;CrossAppDomainDelegate(Test));nbsp;nbsp;nbsp;nbsp;nbsp;Test();nbsp;nbsp;nbsp;}}
nbsp;
nbsp;如果您使用的是一次性调用,上面的代码一点问题也没有,不过要是你使用的是生命周期比较长的对象,如这个远程对象要永久保持的,以便应用程序域之间进行不间断的调用,这种情况下生命周期的问题就出现,因为对象在应用程序域中调用是远程对象调用,对象的生命周期只有5分钟,过了之后,对象就会被垃圾回收机制强制回收.于是应用程序域之间的操作就被间断.
nbsp;nbsp;nbsp; 经过测试,直接使用延长生命周期的方法是最容易的.
nbsp;nbsp;nbsp; 1,客户端获取远程对象
nbsp;nbsp;nbsp; 两个应用服务器中,获取另一个应用程序域的对象中,此应用程序域被当成是客户端.需要使用RemotingServices.GetLifetimeService方法来获取远程对象.
nbsp;nbsp;nbsp; 2,延长生命周期
nbsp;nbsp;nbsp; 使用ILease.Renew来延长对象的生命周期,如直接延长3650天.
nbsp;nbsp;nbsp; 注意:
nbsp;nbsp;nbsp; 使用重写InitializeLifetimeService来延长生命周期的方法在这里不能使用.因为对象在创建的时间根本不可能是远程对象.
nbsp;nbsp;nbsp; 同样,如果您在处理Event时,也会存在生命周期的问题,了解上述的情况可以帮助您更好地解决应用程序域之间的持久交互的问题.
nbsp;
nbsp;
认识AppDomain类的更多相关文章
- C# AppDomain 类
/*** AppDomain 表示应用程序域,它是一个应用程序在其中执行的独立环境.无法继承此类. 应用程序域(由 AppDomain 对象表示)为执行托管代码提供隔离.卸载和安全边界. 使用应用程序 ...
- C# System.AppDomain类
进程是存在独立的内存和资源的,但是AppDomain仅仅是逻辑上的一种抽象.一个process可以存在多个AppDomain.各个AppDomain之间的数据时相互独立的.一个线程可以穿梭多个AppD ...
- System.AppDomain类详解(二)
进程是存在独立的内存和资源的,但是AppDomain仅仅是逻辑上的一种抽象.一个process可以存在多个AppDomain.各个AppDomain之间的数据时相互独立的.一个线程可以穿梭多个AppD ...
- System.AppDomain类详解(一)
AppDomain是CLR(Common Language Runtime:公共语言运行库),它可以加载Assembly.创建对象以及执行程序. AppDomain是CLR实现代码隔离的基本机制. 每 ...
- C#基础知识之System.AppDomain类
进程是存在独立的内存和资源的,但是AppDomain仅仅是逻辑上的一种抽象.一个process可以存在多个AppDomain.各个AppDomain之间的数据时相互独立的.一个线程可以穿梭多个AppD ...
- Assembly中Load, LoadFrom, LoadFile以及AppDomain, Activator类中相应函数的区别
Assembly和AppDomain的一些关于动态加载程序集的函数有些令人头疼,但细细研究后还是可以将他们区分的. 这些函数大致可以分为四类: 第一类:加载到Load Context内 Load Co ...
- C#学习笔记----AppDomain应用程序域
使用.Net建立的可执行程序*.exe,并没有直接承载到进程当中,而是承载到应用程序域(AppDomain)当中.应用程序域是.Net引入的一个新概念,它比进程所占用的资源要少,可以被看做是一个轻量级 ...
- 第四节:监视AppDomain
宿主应用程序可监视AppDomain消耗的资源.有的宿主根据这种信息判断一个AppDomain的内存或CPU消耗是否超过了应有的水准,并强制卸载一个AppDomain. 还可以利用监视来比较不同算法的 ...
- 第二节:AppDomain
CLR COM服务器初始化时,会创建一个AppDomain.AppDomain是一组程序集的逻辑容器.CLR初始化时创建的第一个AppDomain称为默认的AppDomain,这个默认的AppDoma ...
随机推荐
- 跨域Ajax请求时是否带Cookie的设置
1. 无关Cookie跨域Ajax请求 客户端 以 Jquery 的 ajax 为例: $.ajax({ url : 'http://remote.domain.com/corsrequest', d ...
- 挂载时出现mount: RPC: Unable to receive; errno = Connection refused错误的解决方法
当我们在做NFS开发板下挂载时,经常会出现mount: RPC: Unable to receive; errno = Connection refused的错误,连接被拒绝了,到底是什么原因呢? 这 ...
- spring 注入bean的两种方式
我们都知道,使用spring框架时,不用再使用new来实例化对象了,直接可以通过spring容器来注入即可. 而注入bean有两种方式: 一种是通过XML来配置的,分别有属性注入.构造函数注入和工厂方 ...
- ASP.NET MVC 学习笔记之View 和Redriect的区别
首先先说一下Redriect 和RedirectToAction 两个没什么区别,都是向浏览器发送302 Found相应,再有浏览器向对应的url进行请求 只是参数的意义不同而已 再说Redirect ...
- 2018-8-10-win10-uwp-dataGrid
title author date CreateTime categories win10 uwp dataGrid lindexi 2018-08-10 19:16:51 +0800 2018-2- ...
- systemd-tmpfiles - Operation not permitted chown ; systemd-modules-load.service
systemd-tmpfiles-setup.service fail 一般为 /exports/rfs/var/lib/systemd/ 下的文件属性问题 , chown -R root:r ...
- 怎么进行代码审查(Code Review)
代码审查的重要性 代码审查是熟悉软件架构,了解软件业务逻辑的好方法.学习代码是需要切入点的,一个上百万行代码的系统,从哪里开始着手?只能一个模块一个模块,一个组件一个组件的来熟悉,掌握.实现一个比较大 ...
- CodeForces - 337D 树形dp
题意:一颗树上有且仅有一只恶魔,恶魔会污染距离它小于等于d的点,现在已经知道被污染的m个点,问恶魔在的可能结点的数量. 容易想到,要是一个点到(距离最远的两个点)的距离都小于等于d,那么这个点就有可能 ...
- C++使用cout输出中文,打印出来是乱码
windows下的控制台使用的是gbk编码.你输出的是unicode.在Vs中更改高级保存选项,将Unicode改为GB类型(比如GB18030)
- nodejs模块——目录操作
1.创建目录 使用fs.mkdir(path,[mode],callback)创建目录,path是需要创建的目录,[mode]是目录的权限(默认是0777),callback是回调函数. demo:m ...