原文:认识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. EF复合主键

    [Key,Column(Order = )] [Key,Column(Order = )]

  2. docker stack利用secrets启动wordpress

    docker-compose文件 version: '3.1' services: web: image: wordpress ports: - : secrets: - my-pw environm ...

  3. 线性方程组迭代算法——Gauss-Seidel迭代算法的python实现

    原理: 请看本人博客:线性方程组的迭代求解算法——原理 代码: import numpy as np max=100#迭代次数上限 Delta=0.01 m=2#阶数:矩阵为2阶 n=3#维数:3X3 ...

  4. JavaScript中的对象-创建对象的7种模式

    文章来源:http://blog.csdn.net/u014346301/article/details/52204967 ECMA-262把对象定义为:”无需属性的集合,其属性可以包含基本值.对象或 ...

  5. android中的Serveice组件

    创建 配置 Service: 1.定义一个继承了Service类的子类 2.在 AndroidManifest.xml清单文件中对开发的Service进行配置 Service和Activity很相似, ...

  6. Vue项目引入sass

    最近两天手头的事情暂时搞完了,可以抽出空来学习一下东西,之前项目都是鹏哥搭建好了,我们在直接在里面写代码,sass语法用来写样式还是比较方便常用的,今天就来试试怎么引入和配置sass 参考文章:Vue ...

  7. DQN的第一次尝试 -- 软工结对编程第一次作业

    DQN的第一次尝试 在本篇博客中将为大家形象地介绍一下我对DQN的理解,以及我和我的队友如何利用DQN进行黄金点游戏.最后我会总结一下基于我在游戏中看到的结果,得到的dqn使用的注意事项和这次游戏中我 ...

  8. postgresql 两表关联更新

    UPDATE 要更新的表 SET 字段1 = cqt.字段1, 字段2 = cqt.字段2, FROM 数据来源表 cqt WHERE 要更新的表.bsm = cqt.bsm

  9. 2019南昌邀请赛预选赛 I. Max answer (前缀和+单调栈)

    题目:https://nanti.jisuanke.com/t/38228 这题题解参考网上大佬的. 程序的L[i],R[i]代表a[i]这个点的值在区间 [L[i],R[i]] 中最小的并且能拓展到 ...

  10. 【LeetCode】排序

    [349] Intersection of Two Arrays [Easy] 两个无序可重复数组找交集, 交集要求元素唯一. Given nums1 = [1, 2, 2, 1], nums2 =  ...