原文:认识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类的更多相关文章

  1. C# AppDomain 类

    /*** AppDomain 表示应用程序域,它是一个应用程序在其中执行的独立环境.无法继承此类. 应用程序域(由 AppDomain 对象表示)为执行托管代码提供隔离.卸载和安全边界. 使用应用程序 ...

  2. C# System.AppDomain类

    进程是存在独立的内存和资源的,但是AppDomain仅仅是逻辑上的一种抽象.一个process可以存在多个AppDomain.各个AppDomain之间的数据时相互独立的.一个线程可以穿梭多个AppD ...

  3. System.AppDomain类详解(二)

    进程是存在独立的内存和资源的,但是AppDomain仅仅是逻辑上的一种抽象.一个process可以存在多个AppDomain.各个AppDomain之间的数据时相互独立的.一个线程可以穿梭多个AppD ...

  4. System.AppDomain类详解(一)

    AppDomain是CLR(Common Language Runtime:公共语言运行库),它可以加载Assembly.创建对象以及执行程序. AppDomain是CLR实现代码隔离的基本机制. 每 ...

  5. C#基础知识之System.AppDomain类

    进程是存在独立的内存和资源的,但是AppDomain仅仅是逻辑上的一种抽象.一个process可以存在多个AppDomain.各个AppDomain之间的数据时相互独立的.一个线程可以穿梭多个AppD ...

  6. Assembly中Load, LoadFrom, LoadFile以及AppDomain, Activator类中相应函数的区别

    Assembly和AppDomain的一些关于动态加载程序集的函数有些令人头疼,但细细研究后还是可以将他们区分的. 这些函数大致可以分为四类: 第一类:加载到Load Context内 Load Co ...

  7. C#学习笔记----AppDomain应用程序域

    使用.Net建立的可执行程序*.exe,并没有直接承载到进程当中,而是承载到应用程序域(AppDomain)当中.应用程序域是.Net引入的一个新概念,它比进程所占用的资源要少,可以被看做是一个轻量级 ...

  8. 第四节:监视AppDomain

    宿主应用程序可监视AppDomain消耗的资源.有的宿主根据这种信息判断一个AppDomain的内存或CPU消耗是否超过了应有的水准,并强制卸载一个AppDomain. 还可以利用监视来比较不同算法的 ...

  9. 第二节:AppDomain

    CLR COM服务器初始化时,会创建一个AppDomain.AppDomain是一组程序集的逻辑容器.CLR初始化时创建的第一个AppDomain称为默认的AppDomain,这个默认的AppDoma ...

随机推荐

  1. JasperReports教程

    JasperReports教程 Jasper报表是一个开源的Java报表引擎,是基于Java的,它没有自己的表达式语法. 由于JasperReports是一个Java类库,而不是针对最终用户,而是有针 ...

  2. JeeSite配置多数据源方案

    jeesite简介 JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的 开源 Java EE快速开发平台. JeeSite本身是以Spring Framework为核心 ...

  3. 转 jmeter 实现loadrunner init end 功能

    一.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静态和动态资源的性能,例如:静态文件, ...

  4. My Sublime

    Package Control:插件包管理工具 Soda:一个流行的主题,包含代码着色.标签.图标 Emmet:流行的Html编写插件,是zed code升级版包含css编写 SublimeLinte ...

  5. 封装tab切换事件

    HTML <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...

  6. GitHub-Hexo-Blog 集成Gitalk评论插件

    在本文)末尾可查看先查看效果: 1. 新建New OAuth App 在github中,Settings / Develpoer settings OAuth Apps / New OAuth App ...

  7. centos 6.5 修改主机名

    使用 root 账号登录,编辑 vi /etc/sysconfig/network 此时的主机名如下 HOSTNAME=localhost.localdomain 修改 HOSTNAME=newnam ...

  8. vue 页面回退mounted函数不执行的问题及解决方法

    前言 最近做项目碰到一个很头大的问题--从a页面跳到b页面进行编辑,编辑完再返回a页面,却没走a页面的钩子函数mounted,数据没有更新 经过一番面向百度研究,终于找到了问题所在.接下来就记录一下这 ...

  9. API equals方法 toString方法

    API  API: Application(应用) Programming(程序) Interface(接口)  不需要关心这些类是如何实现的,只需要学习这些类如何使用即可. equals方法 1.在 ...

  10. Yii2 搜索

    搜索的形式: 第一种,点击空白处: <?php $data=['0'=>'已删除','10'=>'正常','1'=>'锁定']; ?> <table style=' ...