特别是,在两个不同的应用程序域中运行代码的含义是什么?
数据如何通过应用程序域边界传递?是否与跨过程边界传递数据相同?我很想知道更多有关这种抽象及其有用的内容。
的AppDomain类的现有覆盖率良好答案 0 :(得分:72)
AppDomain基本上提供了一个隔离区域,代码在进程内部运行。
一种简单的方法来考虑它几乎就像一个轻量级的过程坐在你的主要过程中。每个AppDomain都存在于完全隔离的进程中,允许您安全地运行代码(可以在不拆除整个过程的情况下卸载它),具有单独的安全性等。
至于您的具体情况 - 如果您在流程中的2个不同AppDomain中运行代码,则代码将单独运行。 AppDomains之间的任何通信都将被序列化或通过MarshallByRefObject处理。它在这方面非常像使用远程处理。这提供了大量的安全性 - 您可以运行您不信任的代码,如果它出错了,它不会影响您。
MSDN对Application Domains的描述中有更多详细信息。
答案 1 :(得分:19)
它是.NET运行时提供的隔离层。因此,App域存在于一个进程中(1个进程可以有许多应用程序域)并拥有自己的虚拟地址空间。
App域很有用,因为:
答案 2 :(得分:1)
如果从处理器内部详细信息角度来看,它会为代码段(CS)寄存器设置不同的值。代码和CS:IP(指令指针)寄存器是处理器执行的寄存器。
(为了简洁起见,我选择略读页面表相关的讨论)。
AppDomain标记此边界。为了代码安全。
给出这种背景的原因是为了解决这些问题: 1.我们如何跨两个应用程序域访问资源(是的,使用管道或其他一些共享机制,而不是直接作为CS:IP不能设置为其他某个appdomain。只是可以执行此操作的操作系统。不是CLR)
app域中是否有多个主题。技术上是肯定的,因为CS值将在当前流程中。您可以通过跳转语句(函数调用/ goto组合)将IP更改为其他内容
可以在两个不同的app域中进行两个线程进行通信(编号参考第1点。)
单个应用程序域中的两个线程可以进行通信(是。请参阅第2点)
这些案例的其他几个组合可以通过对CS:IP的工作原理知之甚少来解答。
答案 3 :(得分:0)
每个应用程序在一个进程中运行,AppDomain也是一个轻量级的进程,或者我们可以说具有一组程序集的逻辑单元(这是一个包含程序集组的容器)并且它存在于隔离级别的进程内部在同一个过程中,这允许在同一个进程中运行多个程序集并阻止它们直接访问。
在AppDomain中运行Dot Net Application: 一旦任何dot net应用程序运行,操作系统shell将CLR加载到进程中并在同一进程中创建新的AppDomain并加载创建的AppDomain中的所有程序集,现在从AppDomain代码将被执行。
何时自定义AppDomain: 我们可以创建自己的AppDomain,现在我们可以创建自己的AppDomain。假设运行时我们需要添加或删除程序集而不中断正在运行的应用程序,那么我们就可以创建自己的AppDomain。