C#里的应用程序域“AppDomain”是什么?

C#里的应用程序域“AppDomain”是什么?,第1张

应用程序域:(Application Domain,简称App Domain)一组程序集的一个逻辑容器,进程中的一个逻辑分区。通常由运行时宿主创建和 *** 作。AppDomain唯一的作用就是进行隔离。

具体功能:

隔离,一个AppDomain中的代码创建的对象不能由另一个AppDomain中的代码直接访问。达到隔离应用程序的效果。当然如果要访问别的AppDomain中的内容,可以使用“按引用封送”或者“按值封送”的语义。

AppDomain可以卸载,但不能卸载单独的程序集或类型,只能卸载整个应用程序域。从而卸载包含在该AppDomain中的所有程序集。

AppDomain可以单独保护,AppDomain在创建后,会应用一个权限集,它决定了向这个AppDomain中运行的程序集授予的最大权限。从而保护宿主加载的代码不被破坏。

可以单独实施配置,AppDomain在创建后,会关联一组配置设置。这些设置主要影响CLR在AppDomain中加载程序集的方式。这些设置涉及搜索路径、版本重定向、卷影复制以及加载器优化。

首先,描述一下AppDomain是什么:当一个程序集被执行时,系统就会自动为其创建一个AppDomain,每一个AppDomain属于某个进程,一个进程内可以有多个AppDomain;每个AppDomain创建时都有个默认的名称,该名称就是加载的程序集的名称(带扩展名.exe)。

同一windows 进程内的不同AppDomian之间可以互相共享资源,如:CLR,基本.NET类型,地址空间及线程。

程序集在AppDomain中的调用:在同一进程内,如果不同的AppDomain调用同一Assembly会有以下两种情况:

1、会在每个AppDomain中加载该Assembly并为各AppDomain所调用

2、会在该进程内,不在任何的AppDomain中单据加载该Assembly,然后同一进程内的所有AppDomain都可以对其进行调用。这种方式加载的程序集(Assembly)称为域无关(Domain Neutral)的。

AppDomain和线程的关系式正交的;n<--->n的关系。

注意当AppDomain加载了某个Assembly后就无法将其单独卸载,不过可以讲AppDomain卸载掉。

卸载AppDomain时CLR会卸载当前在该AppDomain执行的所有线程,如果此时在执行非托管代码就可能产生问题,并且改AppDomain中所有的托管对象也会被垃圾回收器强制回收;

AppDomain的孤立性:

1)、一个AppDomain可以独立于其他的AppDomain被卸载掉;

2)、一个AppDomain不能放问其他AppDomain内的Assembly和对象;

3)、若没有发生跨边界的异常抛出,一个AppDomain拥有自己独立的异常管理策略。这也就意味着同一进程内的某一AppDomain发生异常不会影响到其他的AppDomain。

4)、每个AppDomain可以定义独自的程序集代码访问安全策略;

5)、每个AppDomain可以定义独自的规则,以便在CLR加载前定位程序集的位置


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7737596.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存