什么是.NET应用程序域?


83

特别是,在两个不同的应用程序域中运行代码的含义是什么?

数据通常如何跨应用程序域边界传递?它与跨过程边界传递数据是否一样?我很好奇要进一步了解这种抽象及其有用之处。

编辑:我不了解应用程序域,一般来说,AppDomain类的现有良好覆盖范围


3
第一部分是stackoverflow.com/questions/622516/i-dont-understand-appdomains的副本。也许应该将问题编辑为关于传递数据。
约翰·桑德斯

糟糕,错过了那个。这可以关闭。
路加福音

Answers:


78

一个应用程序域基本上提供其中内部代码的过程的运行的分离的区域。

一个简单的想法几乎就像是一个位于主流程内部的轻量级流程。每个AppDomain都以完全隔离的方式存在于一个流程中,这使您可以安全地运行代码(可以在不破坏整个流程的情况下将其卸载,并具有单独的安全性等)。

关于您的细节-如果您在一个进程中的2个不同AppDomain中运行代码,则这些代码将独立运行。AppDomain之间的任何通信都将通过MarshallByRefObject进行序列化或处理。在这方面,它的行为非常类似于使用远程处理。这提供了巨大的安全性-您可以运行不信任的代码,并且如果做错了什么,也不会影响您。

MSDN的“应用程序域”描述中有更多详细信息。


您能否澄清“如果做错了什么”的意思?
路加福音

11
一个示例:如果线程池中有未处理的线程,它将删除应用程序域。通常,这将杀死您的进程-如果您正在加载用户代码或插件,这将很危险。在单独的appdomain中运行意味着您可以更好地处理-如果必须拆除第二个AppDomain,则可以在不中断流程的情况下进行处理。
里德·科普西2009年

20

它是.NET运行时提供的隔离层。因此,应用程序域与一个进程一起使用(一个进程可以有多个应用程序域),并具有自己的虚拟地址空间。

应用程序域之所以有用,是因为:

  • 它们比完整过程便宜
  • 它们是多线程的
  • 您可以停止一个进程而不会杀死进程中的所有内容
  • 资源/配置/等隔离
  • 每个应用程序域都以自己的安全级别运行

1

如果从处理器内部细节的角度来看它,它将为代码段(CS)寄存器设置不同的值。代码和CS:IP(指令指针)寄存器是处理器正在执行的寄存器。

(为简洁起见,我选择略过与页表相关的讨论)。

AppDomain标记此边界。为了代码安全。

提供此背景的原因是避免此类问题:1.我们如何跨两个应用程序域访问资源(是的,不是直接使用管道或其他共享机制,因为CS:IP无法设置为其他应用程序域。只有操作系统才能做到这一点,而不是CLR)

  1. 应用程序域中可能有多个线程。从技术上讲,是的,因为CS值将在当前流程中使用。您可以通过跳转语句(函数调用/转到组合)将IP更改为其他名称

  2. 可以在两个不同的应用程序域中的两个线程进行通信(编号请参考第1点。)

  3. 一个应用程序域中的两个线程可以通信吗(是,请参考第2点)

对CS:IP的工作原理知之甚少,可以回答这些情况的其他几种组合。


0

每个运行在一个进程中的应用程序,AppDomain也是一个轻量级的进程,或者我们可以说逻辑单元,它具有一组程序集(这是一个包含一组程序集的容器),并且以相同进程的隔离级别存在于进程内部,这允许在同一进程中运行多个程序集,并防止它们直接访问。

在AppDomain中运行Dot Net应用程序: 一旦运行了任何Dot Net应用程序,操作系统外壳程序就会将CLR加载到一个进程中,并在同一进程中创建新的AppDomain,然后将已加载的AppDomain代码中的所有程序集加载到已创建的AppDomain中。

何时定制AppDomain: 我们可以创建自己的AppDomain,现在可以在哪种情况下创建自己的AppDomain。假设我们需要在运行时添加或删除程序集而不中断正在运行的应用程序,那么我们可以创建自己的AppDomain。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.