1. /***
  2. AppDomain 表示应用程序域,它是一个应用程序在其中执行的独立环境。无法继承此类。
  3.  
  4. 应用程序域(由 AppDomain 对象表示)为执行托管代码提供隔离、卸载和安全边界。
  5.  
  6. 使用应用程序域隔离可能终止进程的任务。如果正在执行任务的 AppDomain 的状态变得不稳定,
  7. 则可以卸载 AppDomain,但不会影响进程。当进程必须不重新启动而长时间运行时,这一点很重要。
  8. 还可使用应用程序域隔离不应共享数据的任务。
  9.  
  10. 如果程序集被加载到默认应用程序域中,则当进程运行时将无法从内存中卸载该程序集。
  11. 但是,如果打开另一个应用程序域来加载和执行程序集,则卸载该应用程序域时也会同时卸载程序集。
  12. 使用此技术最小化长时间运行的进程的工作集,这些进程偶尔会使用大型 DLL。
  13.  
  14. 多个应用程序域可以在一个进程中运行;但是,在应用程序域和线程之间没有一对一的关联。
  15. 多个线程可以属于一个应用程序域,尽管给定的线程并不局限于一个应用程序域,但在任何给定时间,
  16. 线程都在一个应用程序域中执行。
  17.  
  18. 应用程序域通过使用 CreateDomain 方法来创建。AppDomain 实例用于加载和执行程序集 (Assembly)。当不再使用 AppDomain 时,可以将它卸载。
  19.  
  20. AppDomain 类实现一组事件,这些事件使应用程序可以在加载程序集、要卸载应用程序域或引发未处理的异常时进行响应。
  21.  
  22. 有关使用应用程序域的更多信息,请参见 应用程序域。
  23. 此类实现 MarshalByRefObject、_AppDomain 和 IEvidenceFactory 接口。
  24. 在任何情况下都不应创建 AppDomain 对象的可远程控制的包装。这样做可发布对该 AppDomain 的远程引用,
  25. 将诸如 CreateInstance 方法向远程访问公开,并有效损坏该 AppDomain 的代码访问安全性。
  26. 连接到远程 AppDomain 的恶意客户端可以获得对 AppDomain 本身可访问的所有资源的访问权。
  27. 您不应为任何以下类型创建可远程控制的包装:扩展 MarshalByRefObject 的类型和实现恶意客户端可用来绕过安全系统的方法的类型。
  28. **/
  29.  
  30. //警告
  31. //AppDomainSetup.DisallowCodeDownload 属性的默认值为 false。此设置对于服务不安全。若要防止服务下载部分受信任的代码,请将此属性设置为 true。
  32.  
  33. //示例
  34. //此示例显示如何创建新的 AppDomain,在该新建 AppDomain 中实例化类型,以及与该类型的对象通信。
  35. //此外,此示例还显示如何卸载导致对象被垃圾回收的 AppDomain。
  36.  
  37. using System;
  38. using System.Reflection;
  39. using System.Threading;
  40.  
  41. class Module1
  42. {
  43. public static void Main()
  44. {
  45. // Get and display the friendly name of the default AppDomain.
  46. string callingDomainName = Thread.GetDomain().FriendlyName;
  47. Console.WriteLine(callingDomainName);
  48.  
  49. // Get and display the full name of the EXE assembly.
  50. string exeAssembly = Assembly.GetEntryAssembly().FullName;
  51. Console.WriteLine(exeAssembly);
  52.  
  53. // Construct and initialize settings for a second AppDomain.
  54. AppDomainSetup ads = new AppDomainSetup();
  55. ads.ApplicationBase =
  56. System.Environment.CurrentDirectory;
  57. ads.DisallowBindingRedirects = false;
  58. ads.DisallowCodeDownload = true;
  59. ads.ConfigurationFile =
  60. AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
  61.  
  62. // Create the second AppDomain.
  63. AppDomain ad2 = AppDomain.CreateDomain("AD #2", null, ads);
  64.  
  65. // Create an instance of MarshalbyRefType in the second AppDomain.
  66. // A proxy to the object is returned.
  67. MarshalByRefType mbrt =
  68. (MarshalByRefType) ad2.CreateInstanceAndUnwrap(
  69. exeAssembly,
  70. typeof(MarshalByRefType).FullName
  71. );
  72.  
  73. // Call a method on the object via the proxy, passing the
  74. // default AppDomain's friendly name in as a parameter.
  75. mbrt.SomeMethod(callingDomainName);
  76.  
  77. // Unload the second AppDomain. This deletes its object and
  78. // invalidates the proxy object.
  79. AppDomain.Unload(ad2);
  80. try
  81. {
  82. // Call the method again. Note that this time it fails
  83. // because the second AppDomain was unloaded.
  84. mbrt.SomeMethod(callingDomainName);
  85. Console.WriteLine("Sucessful call.");
  86. }
  87. catch(AppDomainUnloadedException)
  88. {
  89. Console.WriteLine("Failed call; this is expected.");
  90. }
  91. }
  92. }
  93.  
  94. // Because this class is derived from MarshalByRefObject, a proxy
  95. // to a MarshalByRefType object can be returned across an AppDomain
  96. // boundary.
  97. public class MarshalByRefType : MarshalByRefObject
  98. {
  99. // Call this method via a proxy.
  100. public void SomeMethod(string callingDomainName)
  101. {
  102. // Get this AppDomain's settings and display some of them.
  103. AppDomainSetup ads = AppDomain.CurrentDomain.SetupInformation;
  104. Console.WriteLine("AppName={0}, AppBase={1}, ConfigFile={2}",
  105. ads.ApplicationName,
  106. ads.ApplicationBase,
  107. ads.ConfigurationFile
  108. );
  109.  
  110. // Display the name of the calling AppDomain and the name
  111. // of the second domain.
  112. // NOTE: The application's thread has transitioned between
  113. // AppDomains.
  114. Console.WriteLine("Calling from '{0}' to '{1}'.",
  115. callingDomainName,
  116. Thread.GetDomain().FriendlyName
  117. );
  118. }
  119. }

C# AppDomain 类的更多相关文章

  1. 认识AppDomain类

    原文:认识AppDomain类 表示应用程序域,它是一个应用程序在其中执行的独立环境. 创建新的 AppDomain,在该新建 AppDomain 中实例化类型,以及与该类型的对象通信. usingn ...

  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. 【莫队算法】【权值分块】bzoj3339 Rmq Problem

    如题. #include<cstdio> #include<algorithm> #include<cmath> using namespace std; #def ...

  2. ListView控件(下)简单适配器

    (一) 1.效果图 2.activiy_main.xml <?xml version="1.0" encoding="utf-8"?> <Li ...

  3. ToggleButton控件,Switch控件

    (一) 1.效果图    2. activity_main.xml <?xml version="1.0" encoding="utf-8"?> & ...

  4. Linux下获取本机IP地址的代码

    Linux下获取本机IP地址的代码,返回值即为互联网标准点分格式的字符串. #define ETH_NAME "eth0" //获得本机IP地址 char* GetLocalAdd ...

  5. 【ztree系列——图标的修改】Bootstrap风格的ztree

    前段时间项目中需要用树形结构,在选取的时候参考了很多插件,经过很多尝试,最后又回归到了ztree上.以前用的界面框架是EasyUI,但是它的树结构在实现起来有点复杂,并且功能不是特别完善.dtree在 ...

  6. 深入理解CommonJS!

    CommonJS 一开始大家都认为JS是辣鸡,没什么用,官方定义的API只能构建基于浏览器的应用程序,CommonJS就按耐不住了,CommonJS API定义很多普通应用程序(主要指非浏览器的应用) ...

  7. centos7安装ifconfig命令

    ifconfig命令是设置或显示网络接口的程序,可以显示出我们机器的网卡信息,可是有些时候最小化安装CentOS等Linux发行版的时候会默认不安装ifconfig等命令,这时候你进入终端,运行ifc ...

  8. 用C++实现文件压缩(1.5)

    今天主要做的就是,将完成huffman编码的数据以二进制的形式写入文件中.这是个挺苦逼的活. 不过好在我以前玩过一段时间的单片机,所有能够较好的实现位运算,一位一位的将数据存放到缓冲区中,然后统一写入 ...

  9. C#秘密武器之反射——替换反射

    反射虽然有时很有必要,但是应用反射的代码大多“复杂难懂”.“性能不高”,因此我们可以找寻在一些场景下替换反射的方法.此处也只是一些栗子,更多巧妙的应用还是自己以后亲自查查~ 先来看看一个使用普通反射完 ...

  10. 字符编码简介:ASCII,Unicode,UTF-8,GB2312

    字符编码简介:ASCII,Unicode,UTF-8,GB2312 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和 1两种状态,因 ...