原文:认识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. Android组件内核之Activity调用栈分析(一)

    阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680 导语 我们陈述一下Activity,Activity是整个应用用户交互的 ...

  2. Python之小测试:用正则表达式写一个小爬虫用于保存贴吧里的所有图片

    很简单的两步: 1.获取网页源代码 2.利用正则表达式提取出图片地址 3.下载 #!/usr/bin/python #coding=utf8 import re # 正则表达式 import urll ...

  3. pthread_create()的一个错误示例

    //pthread_create()函数的错误示例 //新建线程同时传入线程号.线程号总和和消息 #include <stdio.h> #include <pthread.h> ...

  4. springMVC 框架的xml配置文件的说明

    springMVC框架xml文件配置的说明,直接上代码: 我们介绍四个xml文件配置以及xml内容的理解:application.xml.spring-mvc.xml.pom.xml 和 web.xm ...

  5. python之数据序列转换并同时计算数据

    问题 你需要在数据序列上执行聚集函数(比如 sum() , min() , max() ), 但是首先你需要先转换或者过滤数据 解决方案 一个非常优雅的方式去结合数据计算与转换就是使用一个生成器表达式 ...

  6. python--知识小结和集合

    知识小结 一. = 表示赋值 ==表示比较值的大小 is 比较内存地址 二. 数字小数据池:在-5~256之内,id在电脑里是一样的 字符串id一样要求: ①:不能有特殊字符 ②:s(一个单字符)*2 ...

  7. maven环境变量配置及测试

    首先要确认,你是否已经安装了jdk,并且已经成功配置了环境变量. 和java配置类似,计算机右键属性->高级系统设置->环境变量. 添加如下变量: 变量名:maven_home 变量值:C ...

  8. Spark Core 1.3.1源码解析及个人总结

    本篇源码基于赵星对Spark 1.3.1解析进行整理.话说,我不认为我这下文源码的排版很好,不能适应的还是看总结吧. 虽然1.3.1有点老了,但对于standalone模式下的Master.Worke ...

  9. Qt Creator 无法解析的外部符号(转)

    https://blog.csdn.net/yvhvv/article/details/8474356 一直报某个构造函数无法解析,但看了下代码中没有问题,后来把debug文件夹删掉,重新运行后问题解 ...

  10. mongodb的学习 (1)

    1. 启动服务 (1)在D盘下新建mongodb 文件夹,在mongodb 文件夹里面新建db; (2)win+R 启动cmd ,输入 `mongod --dbpath "D:/mongod ...