【问题标题】:What is a .NET application domain?什么是 .NET 应用程序域?
【发布时间】:2010-11-08 19:57:26
【问题描述】:

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

数据通常如何跨应用程序域边界传递?是否与跨流程边界传递数据相同?我很想知道更多关于这个抽象及其用途的信息。

编辑:I don't understand Application DomainsI don't understand Application Domains

【问题讨论】:

标签: .net appdomain


【解决方案1】:

AppDomain 基本上提供了一个隔离区域,代码在其中运行在进程内部。

一种简单的思考方式几乎就像一个轻量级的进程,位于您的主进程中。每个 AppDomain 以完全隔离的方式存在于一个进程中,这使您可以安全地运行代码(如果需要,可以将其卸载而无需拆除整个进程),具有单独的安全性等。

至于您的具体情况 - 如果您在一个进程内的 2 个不同 AppDomain 中运行代码,则代码将单独运行。 AppDomain 之间的任何通信都将通过 MarshallByRefObject 进行序列化或处理。在这方面,它的行为非常类似于使用远程处理。这提供了极大的安全性——你可以运行你不信任的代码,如果它做错了,它不会影响你。

MSDN 对Application Domains 的描述中有更多细节。

【讨论】:

  • 你能解释一下“如果它做错了什么”是什么意思吗?
  • 举个例子:如果你在线程池中有一个未处理的线程,它会拆掉应用域。通常,这会终止您的进程 - 如果您正在加载用户代码或插件,这很危险。在单独的 appdomain 中运行意味着您可以更好地处理 - 如果必须拆除第二个 AppDomain,您可以在不拆除进程的情况下处理它。
【解决方案2】:

它是 .NET 运行时提供的隔离层。因此,App 域存在于一个进程中(一个进程可以有多个应用域)并拥有自己的虚拟地址空间。

应用程序域很有用,因为:

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

【讨论】:

    【解决方案3】:

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

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

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

    给出这个背景的原因是为了逃避这些问题: 1.我们如何跨两个应用程序域访问资源(是的,使用管道或其他共享机制不直接作为CS:IP不能设置为其他应用程序域。它只是可以做到的操作系统。不是CLR)

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

    2. 两个不同应用域中的两个线程能否通信(编号参考第1点。)

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

    如果对 CS:IP 的工作原理知之甚少,就可以回答这些案例的其他几种组合。

    【讨论】:

      【解决方案4】:

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

      在 AppDomain 中运行点网应用程序: 一旦任何 dot net 应用程序运行,操作系统 shell 将 CLR 加载到进程中,并在同一进程中创建新的 AppDomain 并加载创建的 AppDomain 中的所有程序集,现在来自 AppDomain 的代码将被执行。

      何时自定义 AppDomain: 我们可以创建自己的AppDomain,现在问题是在什么场景下我们可以创建自己的AppDomain。假设运行时我们需要在不中断正在运行的应用程序的情况下添加或删除程序集,那么我们可以创建自己的 AppDomain。

      【讨论】:

        猜你喜欢
        • 2023-03-30
        • 1970-01-01
        • 2012-01-24
        • 1970-01-01
        • 2011-05-19
        • 2014-02-11
        相关资源
        最近更新 更多