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