C# 中 AppDomain 最重要的用途是什么?
5 回答
最重要的一个用途是您的代码必须有一个- 即您用 C# 编写的所有内容都在AppDomain
. 这很重要;-p
如果您指的是其他应用程序域:
使用插件和其他不受信任的代码时,它允许您进行隔离和卸载它们的能力(您不能卸载程序集 - 只能卸载整个应用程序域)。
我目前正在使用它来加载动态生成的 dll,以便我可以卸载它们。
它们还允许您设置不同的配置文件、信任级别等 - 但具有相关的复杂性和远程处理成本。
MSDN 在此处有一个关于应用程序域的部分。
我不能告诉你最重要的用途是什么,因为这取决于具体情况。
AppDomains 对于应用程序的沙箱部分很有用。您可以在 AppDomain 中加载扩展并再次卸载它们 - 这是您无法做到的。您可以将特定权限分配给 AppDomain。默认情况下,不同 AppDomain 中的对象不能相互访问。
AppDomain 可以被视为轻量级进程,因为它们为您提供了许多相同的功能。但是,与 Process 不同,新 AppDomain 默认没有自己的线程。您必须自己管理 AppDomain 和线程。
此外,AppDomain 都共享相同的托管堆。这通常不是问题,但它可能会产生令人惊讶的效果,因为某些实例(如字符串)在 AppDomain 之间共享。对于常规使用,这不是问题,但如果您使用字符串进行锁定,不同 AppDomain 中的线程可能会相互影响。
一般来说,使用 AppDomain 并不是日常的编码实践,这可以被认为是一个高级概念。但是,从这个简单的事情开始,更好地理解“AppDomain”这个词背后的概念是很重要的。
在架构方面,尽可能简单,AppDomain 是一个隔离容器,即使在内存寻址方面也是如此,在其中加载和执行应用程序所需的所有程序集,即使这个概念更复杂地解释细节(我希望这不是关于你的问题要深入)。
从那里开始,AppDomain 类首先用于获取对应用程序相关执行应用程序域的访问,这可以通过 Singleton 属性实现来完成AppDomain.CurrentDomain
。通过这种方式,可以:
- 获取已加载程序集的访问权限;
- 获得对 appdomain 共享数据槽的访问权限;
- intems marshalling,在从创建域中加载的程序集中解包创建的实例方面。
然后,AppDomain 类用于:
- 在同一过程中创建更多“域”;
- 在进程中执行程序集;
- 管理 appdomain 的加载/卸载过程。
查看新的 Microsoft 框架(尚未发布)MEF(托管可扩展性框架)的代码可能很有用,它真正基于 AppDomains 创建和卸载、动态加载的程序集等概念。
作为一个简单的例子和你可以用 AppDomains 做什么的例子,我可以分享这个链接。
我希望我回答了你的问题。
AC# AppDomain 是一个逻辑隔离的容器,在其中运行 .NET 代码。当您运行任何 .NET 代码时,它始终在默认应用程序域中运行。
请观看这个 30 分钟的 youtube 视频什么是 C# AppDomain ?其中更详细地解释了 AppDomain。
但是,让我仍然尝试更详细地解释。假设您获得了第三方 DLL,并且您想在您的应用程序中使用它。但是您也怀疑第三方可能有一些恶意代码,因此您希望在受限环境中运行第三方 DLL。比如你不想让第三方访问你的c:盘或者删除文件等等。
因此,您可以创建两个 AppDomain,一个用于第三方,一个用于您自己的 C# 类。对于第三方应用程序域,您将应用它无法访问 c: 驱动器的安全约束,而对于您的 C# DLL,您将拥有一个不受限制的应用程序域。
请阅读我的博客,了解运行时加载 DLL 和使用 AppDomain 进行交叉通信的标准应用程序。https://blog.vcillusion.co.in/sending-events-through-application-domain-boundary/
- DLL 的运行时加载和卸载:我从事过一个项目,其中 DLL 由用户在运行时加载,在程序执行期间,方法使用反射执行并在程序运行期间卸载。
- 保护我的主执行程序:我们正在动态加载 DLL,因此动态加载的 DLL 中发生的任何异常都不会影响我的主 AppDomain。如果出现损坏情况,我们可以选择再次有效地卸载和加载 DLL。
- 跨 AppDomain 通信:我们可以在运行时动态加载任意两个 DLL 在不同的 AppDomain 中,并使它们相互通信。