多个.NET AppDomains的代码示例

多个.NET AppDomains的代码示例,.net,appdomain,.net,Appdomain,发件人: 您可以在单个进程中运行多个应用程序域,其隔离级别与单独进程中的隔离级别相同,但不会产生跨进程调用或在进程之间切换的额外开销 我想了解更多关于如何/为什么在应用程序中实际使用多个AppDomain的信息。有人能提供一个实际代码片段的示例吗?我已经在以下上下文中使用了这个示例(我现在手头没有代码可以发布) 创建新的AppDomain(例如appDomainX) 使用此新域创建对象的新实例 新对象(位于新对象中)加载一组程序集 反思它们以收集一些指标 产生结果 卸载appDomainX

发件人:

您可以在单个进程中运行多个应用程序域,其隔离级别与单独进程中的隔离级别相同,但不会产生跨进程调用或在进程之间切换的额外开销


我想了解更多关于如何/为什么在应用程序中实际使用多个AppDomain的信息。有人能提供一个实际代码片段的示例吗?

我已经在以下上下文中使用了这个示例(我现在手头没有代码可以发布)

  • 创建新的AppDomain(例如appDomainX)
  • 使用此新域创建对象的新实例
  • 新对象(位于新对象中)加载一组程序集
  • 反思它们以收集一些指标
  • 产生结果
  • 卸载appDomainX

这样做的好处是,您可以卸载加载到新创建的AppDomain中的程序集。如果您在主AppDomain上一次又一次地加载更多程序集,您的AppDomain将急剧增长。创建一个单独的AppDomain允许您在每次检查后卸载,从而卸载加载到该域的所有程序集,因此主AppDomain保持干净。

阅读MSDN实际上提供了一些很好的信息

——丹

< P>我使用了一个(大部分)C++软件,允许用户编写脚本来使用C语言或VB.NET实现应用程序的自动化。该应用程序还有一些组件是用C#编写的。它使用一个AppDomain作为程序组件,另一个用于沙箱脚本


最初的脚本实现为每个脚本创建了一个AppDomain,但这被证明太慢,并且阻止了一些有用的脚本行为,因此我们为脚本引擎使用了一个永久AppDomain。

您可能希望使用一个AppDomain来模拟IIS的处理。您需要一个长时间运行的进程来泄漏内存。您可以跟踪AD上已处理的请求数量,如果您达到某个阈值,则可以启动一个新的请求。当旧应用程序完成所有处理后,卸载它并让CLR清理一些应用程序垃圾

别问我是怎么知道的


如果要在不同的安全上下文中运行代码,也可以这样做。

对于.NET应用程序来说,在其(单个)安全上下文中创建多个
AppDomain
实例非常有用这个过程是在一些概念上相关的对象实例的大型集合中管理静态变量的范围

例如,考虑一个数据库应用程序,其中“强>90%<强”的代码管理一组相互关联的.NET对象,这些对象包括各种表、行和其他视图或数据实体,它们都属于同一个顶级数据库。在为数据库本身编写代码时,最好让这个对象图中的每个子实例都是自给自足的,这意味着每个对象单独携带(通过包含)足够的信息来确定它需要与数据库其余部分相关的任何/所有上下文,而不需要任何外部引用。这允许您传递任何类型的次要实体,而不必担心它内部可能需要什么额外的上下文

这种便利的代价是,整个应用程序中的每个次要子对象都携带它所需的上下文作为内部字段。如果应用程序还需要支持多个数据库,例如允许在数据库之间进行比较、导入或导出操作(比如代码的另一个10%),则每个对象的上下文必须包含直接或间接区分其最终所属数据库的信息

这些额外的信息可能会导致内存膨胀,尤其是在数量更多的低级实例中,并且对于一个给定的“流行”数据库,根据定义,许多这种携带的上下文都是重复的

AppDomain
为了拯救…
相反,代码的数据库部分可以与每个数据库的不同
AppDomain
相关联。由于静态变量的作用域是其
AppDomain
,因此您可以将数据库的顶级信息与
AppDomain
相关联,每个次要实例都会固有地知道它属于哪个数据库,或者是相对于
AppDomain.CurrentDomain
静态属性,或者是通过简单地引用静态字段,属性和定义的方法都没有任何额外的每个实例字段

注意,数据库间(10%部分)代码一次只能以这种方式引用一个数据库。在此类操作期间,必须明确引用任何其他数据库(以传统方式)。但是,对于大部分代码,这种技术可能会消除跨所有这些上下文字段部署的数百万个对象引用。如果您反对全局单例的想法,请注意,
AppDomain.CurrentDomain
已经存在于您的.NET代码中——那么为什么不好好利用它呢