频道栏目
读书频道 > web开发 > .NET > .NET安全揭秘
3.1.3 卸载应用程序域
2012-10-24 16:04:26     我来说两句
收藏   我要投稿

本文所属图书 > .NET安全揭秘

全书共分为五个部分。第一部分:.NET安全基础,透彻讲解了.NET体系结构、程序集与反射、应用程序域和CLR寄宿等核心技术,这部分内容是.NET架构的核心,同时也是理解.NET底层安全机制的基础;第二部分:.NET平台安...  立即去当当网订购

当使用完应用程序域时,可用System.AppDomain.Unload方法将其卸载。Unload 方法会正常关闭指定的应用程序域。卸载过程中,没有新线程可以访问该应用程序域,并且会释放该应用程序域特定的所有数据结构。加载到应用程序域中的所有程序集都会被移除,无法再使用。如果应用程序域中的程序集不是特定于域的,则程序集的数据会保留在内存中,直到整个进程关闭。除了关闭整个进程,没有机制可以卸载非特定于域的程序集。在某些情况下,卸载应用程序域的请求不起作用,并导致
CannotUnloadAppDomainException。代码清单3-2在代码清单3-1的基础上添加了卸载xuanhunDomain程序域的语句,并且在卸载后再次尝试输出该应用程序域的名称,这将引发CannotUnloadAppDomainException。

代码清单3-2卸载应用程序域

class Program
{
static void Main(string[] args)
{
AppDomain myDomain= AppDomain.CreateDomain("xuanhunDomain");
Console.WriteLine("myDomain name is :{0}",myDomain.FriendlyName);
Console.WriteLine("当前程序域的名称是:{0}", AppDomain.CurrentDomain.FriendlyName);
AppDomain.Unload(myDomain);
 try//试图访问被卸载的应用程序域
{
Console.WriteLine("myDomain name is :{0}", myDomain.FriendlyName);
}
catch (CannotUnloadAppDomainException e)
{
Console.WriteLine(e.Message);
}
Console.ReadKey();
}

输出结果如图3-2所示。


 

将程序集加载到应用程序域的方法已经在第2章中介绍过,这里不再重复。下面接着讨论如何获得当前线程的应用程序域的相关信息,如代码清单3-3所示。

代码清单3-3获得当前线程应用程序域的相关信息

public void GetDomainInfo()
{
ActivationContext tContext = AppDomain.CurrentDomain.ActivationContext;//获取上下文信息
ApplicationIdentity
tIdentity=AppDomain.CurrentDomain.ApplicationIdentity;
 //获取应用程序标识
System.Security.Policy.ApplicationTrust tTrust = AppDomain.CurrentDomain.ApplicationTrust;
 //获取当前程序的信任级别
string tDirectory = AppDomain.CurrentDomain.BaseDirectory;
 // 获取基目录,它由程序集冲突解决程序用来探测程序集
AppDomainManager tDomainManager = AppDomain.CurrentDomain.DomainManager;
 //获得初始化应用程序域时主机提供的域管理器
string tDynamicDirectory = AppDomain.CurrentDomain.DynamicDirectory;
 //获取目录,它由程序集冲突解决程序用来探测动态创建的程序集
System.Security.Policy.Evidence tEvidence = AppDomain.CurrentDomain.Evidence;
 //获取与此应用程序域相关联的 Evidence,它用于安全策略的输入
string tFrindlyName = AppDomain.CurrentDomain.FriendlyName;
 //获取此应用程序域的友好名称
int tId = AppDomain.CurrentDomain.Id;
 //获得一个整数,该整数唯一标识进程中的应用程序域
bool tIsFullTrusted = AppDomain.CurrentDomain.IsFullyTrusted;
 //表示当前应用程序域中的程序集是否为完全信任级别
bool tIsHomogenous = AppDomain.CurrentDomain.IsHomogenous;
 //获取一个值表示是否拥有对加载到当前应用程序域的所有程序集的权限集合
long tMSMemorySize = AppDomain.CurrentDomain.MonitoringSurvivedMemorySize;
long tMTAMemorySieze = AppDomain.CurrentDomain.MonitoringTotalAllocatedMemorySize;
TimeSpan tMTPTime = AppDomain.CurrentDomain.MonitoringTotalProcessorTime;
System.Security.PermissionSet tPermissionSet = AppDomain.CurrentDomain.PermissionSet;
 //获取权限集
string tRPath = AppDomain.CurrentDomain.RelativeSearchPath;
 //获取相对于基目录的路径,在此程序集冲突解决程序应探测专用程序集
AppDomainSetup tASetup = AppDomain.CurrentDomain.SetupInformation;
 //安装信息
bool tSCopyFiles = AppDomain.CurrentDomain.ShadowCopyFiles;
 //获取一个指示值,它表明加载到应用程序域中的所有程序集是否为影像复制的
}

在代码清单3-3中,使用AppDomain.CurrentDomain的属性来获取当前应用程序域的实例,可以从中获取当前应用程序域的相关信息,其中.NET 4.0中新增的属性如下:

 AppDomain.CurrentDomain.MonitoringSurvivedMemorySize。获取上次完全阻止回收后保留下来的、已知由当前应用程序域引用的字节数。

 AppDomain.CurrentDomain.MonitoringTotalAllocatedMemorySize。获取自创建应用程序域后由应用程序域进行的所有内存分配的总大小(以字节为单位,不扣除已回收的内存)。

 AppDomain.CurrentDomain.MonitoringTotalProcessorTime。获取自进程启动后所有线程在当前应用程序域中执行时所使用的总处理器时间。

 AppDomain.CurrentDomain.PermissionSet。获取沙箱应用程序域的权限集。

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:3.1.2 创建应用程序域
下一篇:3.2 CLR寄宿
相关文章
图文推荐
排行
热门
最新书评
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站