认识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 ...
随机推荐
- 元类,sqlalchemy查询
import sqlalchemy from sqlalchemy.ext.declarative import declarative_base #创建连接实例 db = sqlalchemy.cr ...
- 使用Emacs来编程
使用Emacs来编程 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #839496;} code ...
- Selenium3 + Python3自动化测试系列十二——窗口截图与关闭浏览器
窗口截图 自动化用例是由程序去执行的,因此有时候打印的错误信息并不十分明确.如果在脚本执行出错的时候能对当前窗口截图保存,那么通过图片就可以非常直观地看出出错的原因.WebDriver提供了截图函数g ...
- springboot Service层单元测试
两个实现类实现同一个Service接口 public interface CustomUrlService { List<ShopMetrics> getShopMetrics(); } ...
- vi 常用的命令
1.vi的两种模式:命令模式.输入模式 2.vi命令 2.1 vi 进入vi的一个临时缓冲区,光标定位在该缓冲区第1行第1列的位置上 2.2 vi file1 如果file1文件不存在,将建立此文件 ...
- 使用SQLiteOpenHelper管理SD卡中的数据库
本人在网上找了好多大牛的资料,研究了几天终于调试出来了.以下是笔记: SQLiteOpenHelper是Android框架为我们提供的一个非常好的数据库打开.升级与关闭的工具类.但是这个工具类会自动把 ...
- android5.1 修改音量键绑定多媒体声音
修改此文件frameworks/base/media/java/android/media/AudioService.java中函数 private int getActiveStreamType(i ...
- 编写Android.mk中的LOCAL_SRC_FILES的终极技巧(转)
转自:http://blog.csdn.net/fu_zk/article/details/12836431 问题的引入 在使用NDK编译C/C++项目的过程中,免不了要编写Android.mk文件, ...
- HDU 6326 Problem H Monster Hunter
\(\mathtt{Problem H}\) \(\mathtt{Monster}\) \(\mathtt{Hunter}\) \(\mathcal{Description}\) 题目 给定一棵 \( ...
- Ubuntu 图形桌面死机重启(机器不重启)
Ubuntu的图形界面容易死机,如果正在跑程序的话又不能重启.这时候可以通过终端来_重启_图形界面. 首先按Alt+Ctrl+F1进入终端界面.查看图形界面的进程: ps -t tty7 查看到名为X ...