10

即使我们没有专门创建 AppDomain,是否每个 C# 程序都有一个 AppDomain?为什么需要它?如果我们不将第三方程序集加载到单独的 AppDomain 中,我已经阅读了有关第三方程序集会使整个应用程序崩溃的信息。我没有很好地理解这一点。任何人都可以解释这一点。

4

5 回答 5

15

AppDomain很像一个进程,它是您的应用程序在其中运行的基础架构。需要在其中加载 .NET 程序集AppDomain才能运行。不需要将第三方程序集加载到单独AppDomains的 中,但如果这样做,它会在它们之间提供隔离(如两个单独的进程),并且其中一个发生故障不会影响另一个。应用程序域可以独立卸载。

例如,SQL Server 使用AppDomains 在其进程中安全地加载 CLR 程序集。

于 2009-04-22T09:24:30.997 回答
3

如果我们不使用 AppDomain,我已经阅读了有关导致崩溃的 3rd 方程序集

我认为您正在谈论将其他程序集加载到单独的应用程序域中。这样他们就可以与您的地址空间隔离,以防止他们的代码崩溃影响您。代价是与单独的应用程序域中的程序集进行通信更加困难并且具有性能损失,因为所有调用都需要跨越应用程序域边界进行军事处理。

这是一个相当高级的话题,我建议在Richter中阅读(其他书籍可用)。

于 2009-04-22T09:32:00.980 回答
2

每个应用程序至少有一个应用程序域,是的。

我不知道关于第 3 方集会的说明是什么意思。

于 2009-04-22T09:24:19.937 回答
1

每个程序至少有一个 appdomain,您可以创建任意数量的程序,但您很少需要超过一个。

它基本上是一个容器,其中以特定信任运行的代码正在运行。

于 2009-04-22T09:26:34.223 回答
1

有一个默认的应用程序域,您的应用程序被加载到其中(每个实例都有自己的)。

崩溃意味着第三方程序集(即插件)如果您不将其加载到单独的应用程序域中,它将在崩溃时崩溃您的整个应用程序。因此,最好将插件加载到单独的应用程序域中,因为应用程序域中的崩溃只会导致该应用程序域崩溃,而其他域不会崩溃。CLR 插件博客有一些关于此的文章。

需要注意的重要一点是,应用程序域不一定需要在同一进程或同一系统上,因此您基本上需要它来进行远程处理。

于 2009-04-22T09:28:44.967 回答