AppDomain在C#中的用法


Answers:


79

最重要单一用途是您的代码必须具有一个,即,您在C#中编写的所有内容都在AppDomain。那很重要;-p

如果您是指其他应用程序域:

使用插件和其他不受信任的代码时,它既可以隔离又可以卸载它们(您不能卸载程序集-只能卸载整个应用程序域)。

我目前正在使用它来加载动态生成的dll,以便可以卸载它们。

它们还允许您设置不同的配置文件,信任级别等-但具有相关的复杂性和远程处理成本。

MSDN在此处提供有关应用程序域的部分。


30

我无法告诉您最重要的用途是什么,因为这取决于具体情况。

AppDomain对于将应用程序的各个部分进行沙箱处理很有用。您可以在AppDomain中加载扩展,然后再次将其卸载-否则您将无法完成。您可以为AppDomains分配特定权限。默认情况下,不同AppDomain中的对象无法相互访问。

AppDomains可以为您提供许多相同的功能,因此可以看作是轻量级的过程。但是,与Process不同,新的AppDomain在默认情况下没有自己的线程。您必须自己管理AppDomain和线程。

另外,AppDomains都共享相同的托管堆。通常这不是问题,但可能会产生令人惊讶的效果,因为在AppDomain之间共享字符串等某些实例。对于常规使用而言,这不是问题,但是如果使用字符串进行锁定,则不同AppDomain中的线程可能会相互影响。


2
关于字符串的注意事项。
AgentFire

2
“ AppDomain全部共享相同的托管堆。” 这是否意味着它们也共享静态类或静态方法?
数学

22

通常,使用AppDomains并不是日常的编码实践,可以将其视为高级概念。但是,从这个简单的事情开始,更好地理解“ AppDomain”一词背后的概念很重要。

就架构而言,并尽可能简化,即使在内存寻址方面,AppDomain也是一个隔离容器,在其中装入并执行了应用程序所需的所有程序集,即使此概念更复杂以致于无法详细解释。 (我希望这不是您要进一步深入的问题)。

从那里开始,首先使用AppDomain类获取对与应用程序相关的正在执行的应用程序域的访问,这可以通过Singleton属性实现来完成AppDomain.CurrentDomain。通过这种方式可以:

  1. 获取访问已加载的程序集的权限;
  2. 获得对appdomain共享数据插槽的访问权限;
  3. 就从已创建的域中已加载的程序集解开已创建的实例而言,内部编组。

然后,AppDomain类用于:

  1. 在相同的过程中创建更多的“域”;
  2. 在过程中执行程序集;
  3. 管理应用程序域的加载/卸载过程。

查看新的Microsoft框架(尚未发布)MEF(托管扩展框架)的代码可能很有用,该框架真正基于AppDomains创建和卸载,动态加载的程序集等概念。

作为简单的示例以及您可以使用AppDomains进行示例的示例,我可以共享此链接

希望我回答了你的问题。


9

AC#AppDomain是一个逻辑隔离的容器,在其中运行.NET代码。当您运行任何.NET代码时,它始终在默认的appdomain中运行。

请观看这30分钟的youtube视频。C#AppDomain是什么?其中详细介绍了AppDomain。

C#Appdomain

但是,让我仍然尝试更详细地解释。假设您获得了第三方DLL,并且想要在应用程序中使用它。但是您还怀疑第三方可能包含一些恶意代码,因此您想在受限的环境中运行第三方DLL。就像您不希望第三方访问您的c:驱动器或删除文件等。

因此,您可以创建两个AppDomain,一个用于第三方,另一个用于您自己的C#类。对于第三方appdomain,您将应用它不能访问c:驱动器的安全约束,对于C#DLL,您将具有不受限制的应用程序域。


2

请阅读我的博客,了解DLL的运行时加载和使用AppDomain进行交叉通信的标准应用程序。https://blog.vcillusion.co.in/sending-events-through-application-domain-boundary/

  1. 运行时DLL的加载和卸载:我从事的项目是用户在运行时加载DLL,并且在程序执行期间,这些方法是使用Reflection执行的,并在程序运行期间进行卸载。
  2. 保护我的主执行程序:我们正在动态加载DLL,因此在该动态加载的DLL中发生的任何异常都不会影响我的主AppDomain。在发生损坏的情况下,我们可以选择有效地卸载并再次加载DLL。
  3. 跨AppDomain通讯:我们可以在运行时动态加载任意两个DLL到不同的AppDomain中,并使它们彼此通信。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.