在C#中使用AppDomain
在C#中AppDomain最重要的用途是什么?
唯一最重要的用途就是你的代码必须有一个 – 也就是你用C#编写的所有东西都在AppDomain
执行。 这是非常重要的;
如果你的意思是额外的应用程序域:
当使用插件和其他不受信任的代码时,它允许你隔离和卸载它们的能力(你不能卸载程序集 – 只有整个应用程序域)。
我目前使用它来加载dynamic生成的DLL,以便我可以卸载它们。
他们还允许你设置不同的configuration文件,信任级别等,但是还有相关的复杂性和远程处理成本。
MSDN在这里有一个关于应用程序域的部分。
我不能告诉你最重要的用途是什么,因为这取决于情况。
AppDomain对沙盒部分的应用程序非常有用。 您可以在AppDomain中加载扩展,然后再次卸载它们,这是您无法做到的。 您可以为AppDomain分配特定的权限。 每个AppDomain中的默认对象不能互相访问。
AppDomain可以被看作是轻量级的stream程,因为它们提供了许多相同的function。 但是,与“进程”不同,新的AppDomain在默认情况下没有自己的线程。 你必须自己pipe理AppDomain和线程。
此外,AppDomain都共享相同的托pipe堆。 这通常不是问题,但它可能会有令人惊讶的效果,因为某些实例像string在AppDomain中共享。 对于经常使用这不是一个问题,但如果你使用string进行locking,不同的AppDomain中的线程可以相互影响。
一般来说,使用AppDomain并不是日常的编程习惯,这可以被认为是一种先进的概念。但是,从这个简单的事情开始,理解“AppDomain”这个词背后的概念是很重要的。
就体系结构而言,尽可能简化一个AppDomain即使在内存寻址方面也是一个隔离容器,在它内部加载和执行一个应用程序所需的所有程序集,即使这个概念更加复杂(我希望这不是更深入的问题)。
从那里开始,AppDomain类首先被用来获得对应用程序相关执行应用程序域的访问,这可以通过Singleton属性实现AppDomain.CurrentDomain
来完成。 通过这种方式可以:
- 获取访问加载的程序集;
- 获得访问应用程序域共享的数据插槽;
- 在从创build的域中加载的程序集中解开创build的实例方面进行编组。
然后,AppDomain类被用来:
- 在同一个过程中创造更多的“领域”
- 在过程中执行组件;
- pipe理appdomain的加载/卸载过程。
查看真正基于AppDomain创build和卸载,dynamic加载程序集等概念的新Microsoft Framework(尚未发布) MEF(Managed Extesibility Framework)的代码可能很有用。
作为一个简单的例子,你可以用AppDomain做些什么,我可以分享这个链接 。
我希望我回答你的问题。
AC#AppDomain是.NET代码运行的一个逻辑上隔离的容器。 当你运行任何.NET代码时,它总是运行在一个默认的appdomain中。
请观看这30分钟youtubevideo什么是C#AppDomain? 这更详细地解释了AppDomain。
但是,让我仍然试图更详细地解释。 比方说,你得到一个第三方DLL,你想在你的应用程序中使用它。 但是你也怀疑,第三方可以有一些恶意代码,所以你想在受限制的环境中运行第三方DLL。 就像您不希望第三方访问您的c:驱动器或删除文件等一样。
所以你可以创build两个AppDomain,一个用于第三方,一个用于你自己的C#类。 对于第三方appdomain,您将应用安全约束,它不能访问c:驱动器和您的C#DLL,您将有一个不受限制的应用程序域。