System.AppDomain类详解(二)
进程是存在独立的内存和资源的,但是AppDomain仅仅是逻辑上的一种抽象。一个process可以存在多个AppDomain。各个AppDomain之间的数据时相互独立的。一个线程可以穿梭多个AppDomain。
一、属性
ActivationContext 获取当前应用程序域的激活上下文。
ApplicationIdentity 获得应用程序域中的应用程序标识。
ApplicationTrust 获取说明授予应用程序的权限以及应用程序是否拥有允许其运行的信任级别的信息。
BaseDirectory 获取基目录,它由程序集冲突解决程序用来探测程序集。
CurrentDomain 获取当前 Thread 的当前应用程序域。
DomainManager 获得初始化应用程序域时主机提供的域管理器。
DynamicDirectory 获取目录,它由程序集冲突解决程序用来探测动态创建的程序集。
Evidence 获取与该应用程序域关联的 Evidence。
FriendlyName 获取此应用程序域的友好名称。
Id 获得一个整数,该整数唯一标识进程中的应用程序域。
IsFullyTrusted 获取一个值,该值指示加载到当前应用程序域的程序集是否是以完全信任方式执行的。
IsHomogenous 获取一个值,该值指示当前应用程序域是否拥有一个为加载到该应用程序域的所有程序集授予的权限集。
MonitoringIsEnabled 获取或设置一个值,该值指示是否对当前进程启用应用程序域的 CPU 和内存监视。 一旦对进程启用了监视,则无法将其禁用。
MonitoringSurvivedMemorySize 获取上次完全阻止回收后保留下来的、已知由当前应用程序域引用的字节数。
MonitoringSurvivedProcessMemorySize 获取进程中所有应用程序域的上次完全阻止回收后保留下来的总字节数。
MonitoringTotalAllocatedMemorySize 获取自从创建应用程序域后由应用程序域进行的所有内存分配的总大小(以字节为单位,不扣除已回收的内存)。
MonitoringTotalProcessorTime 获取自从进程启动后所有线程在当前应用程序域中执行时所使用的总处理器时间。
PermissionSet 获取沙盒应用程序域的权限集。
RelativeSearchPath 获取基目录下的路径,在此程序集冲突解决程序应探测专用程序集。
SetupInformation 获取此实例的应用程序域配置信息。
ShadowCopyFiles 获取应用程序域是否配置为影像副本文件的指示。
public class Program
{
static void Main(string[] args)
{
AppDomain appdomain = AppDomain.CurrentDomain; //获取当前 Thread 的当前应用程序域。
Console.WriteLine(appdomain.Id); //输出 1 获得一个整数,唯一标识进程中的应用程序域。
Console.WriteLine(appdomain.ActivationContext); //输出 空白 获取当前应用程序域的激活上下文。
Console.WriteLine(appdomain.ApplicationIdentity); //输出 空白 获得应用程序域中的应用程序标识。 ApplicationTrust AT = appdomain.ApplicationTrust; //获取说明授予应用程序的权限以及应用程序是否拥有允许其运行的信任级别的信息。
Console.WriteLine(appdomain.ApplicationTrust); //输出 System.Security.Policy.ApplicationTrust Console.WriteLine(appdomain.BaseDirectory); //输出 F:\xxx\xxx\ConsoleApplication1\bin\Debug\ 获取基目录,它由程序集冲突解决程序用来探测程序集。 AppDomainManager Adm = appdomain.DomainManager; //获得初始化应用程序域时主机提供的域管理器。
Console.WriteLine(Adm.EntryAssembly.Location); //输出 F:\xxx\xxx\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe
Console.WriteLine(appdomain.DomainManager); //输出 Microsoft.VisualStudio.HostingProcess.VSHostAppDomainManager Console.WriteLine(appdomain.DynamicDirectory); //输出 空白 获取目录,它由程序集冲突解决程序用来探测动态创建的程序集。 Evidence ed = appdomain.Evidence; //另外一个东西了 获取与该应用程序域关联的 Evidence。
Console.WriteLine(appdomain.Evidence.ToString()); //输出 System.Security.Policy.Evidence Console.WriteLine(appdomain.FriendlyName); //输出 ConsoleApplication1.vshost.exe 获取此应用程序域的友好名称。 Console.WriteLine(appdomain.IsFullyTrusted); //输出 True 获取一个值,该值指示加载到当前应用程序域的程序集是否是以完全信任方式执行的。 Console.WriteLine(appdomain.IsHomogenous); //输出 True 获取一个值,该值指示当前应用程序域是否拥有一个为加载到该应用程序域的所有程序集授予的权限集。 Console.WriteLine(AppDomain.MonitoringIsEnabled); //输出 False 获取或设置一个值,该值指示是否对当前进程启用应用程序域的 CPU 和内存监视。 一旦对进程启用了监视,则无法将其禁用。 AppDomain.MonitoringIsEnabled = true;
//要上面那个属性启用之后,这个属性才能用
Console.WriteLine(appdomain.MonitoringSurvivedMemorySize); //输出 0 获取上次完全阻止回收后保留下来的、已知由当前应用程序域引用的字节数。
Console.WriteLine(appdomain.MonitoringTotalAllocatedMemorySize); //输出 0 获取自从创建应用程序域后由应用程序域进行的所有内存分配的总大小(以字节为单位,不扣除已回收的内存)。
Console.WriteLine(appdomain.MonitoringTotalProcessorTime); //输出 00:00:00 获取自从进程启动后所有线程在当前应用程序域中执行时所使用的总处理器时间。 System.Security.PermissionSet ps = appdomain.PermissionSet; //获取沙盒应用程序域的权限集。 Console.WriteLine(appdomain.PermissionSet.ToString()); //输出 <PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true"/> Console.WriteLine(appdomain.RelativeSearchPath); //输出 空白 Console.WriteLine(appdomain.SetupInformation); //输出 AppDomainSetup 获取此实例的应用程序域配置信息。 Console.WriteLine(appdomain.ShadowCopyFiles); //输出 False File.WriteAllText(@"D:\123.txt", appdomain.PermissionSet.ToString()); //SetupInformation 获取此实例的应用程序域配置信息。
//ShadowCopyFiles 获取应用程序域是否配置为影像副本文件的指示。 Console.ReadKey();
}
二、方法
名称 说明
ApplyPolicy 返回应用策略后的程序集显示名称。
CreateComInstanceFrom(String, String) 创建指定 COM 类型的新实例。 形参指定文件的名称,该文件包含含有类型和类型名称的程序集。
CreateDomain(String) 使用指定的名称新建应用程序域。
CreateInstance(String, String) 创建在指定程序集中定义的指定类型的新实例。
CreateInstanceAndUnwrap(String, String) 创建指定类型的新实例。 形参指定定义类型的程序集以及类型的名称。
CreateInstanceFrom(String, String) 创建在指定程序集文件中定义的指定类型的新实例。
CreateObjRef 创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。 (继承自 MarshalByRefObject。)
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess) 以指定名称和访问模式定义动态程序集。
DoCallBack 在另一个应用程序域中执行代码,该应用程序域由指定的委托标识。
ExecuteAssembly(String) 执行指定文件中包含的程序集。
ExecuteAssemblyByName(String) 在给定其显示名称的情况下执行程序集。
GetAssemblies 获取已加载到此应用程序域的执行上下文中的程序集。
GetData 为指定名称获取存储在当前应用程序域中的值。
GetLifetimeService 检索控制此实例的生存期策略的当前生存期服务对象。 (继承自 MarshalByRefObject。)
InitializeLifetimeService 通过防止创建租约来给予 AppDomain 无限生存期。 (重写 MarshalByRefObject.InitializeLifetimeService()。)
IsCompatibilitySwitchSet 获取可以为 null 的布尔值,该值指示是否设置了任何兼容性开关,如果已设置,则指定是否设置了指定的兼容性开关。
IsDefaultAppDomain 返回一个值,指示应用程序域是否是进程的默认应用程序域。
IsFinalizingForUnload 指示此应用程序域是否正在卸载以及公共语言运行时是否正在终止该域包含的对象。
Load(AssemblyName) 在给定 AssemblyName 的情况下加载 Assembly。
ReflectionOnlyGetAssemblies 返回已加载到应用程序域的只反射上下文中的程序集。
SetData(String, Object) 为指定的应用程序域属性分配指定值。
SetData(String, Object, IPermission) 将指定值分配给指定应用程序域属性,检索该属性时要求调用方具有指定权限。
SetPrincipalPolicy 指定在此应用程序域中执行时如果线程尝试绑定到用户,用户和标识对象应如何附加到该线程。
SetThreadPrincipal 设置在以下情况下要附加到线程的默认主体对象,即当线程在此应用程序域中执行时,如果线程尝试绑定到主体这种情况。
Unload 卸载指定的应用程序域。
class Program
{
static void Main(string[] args)
{
AppDomain app = AppDomain.CreateDomain("测试程序域"); //使用指定的名称创建应用程序域
ObjectHandle objHan = app.CreateInstance("MySpace", "MySpace.Person"); //创建指定程序集中指定的对象
var obj = objHan.Unwrap();
Console.WriteLine(obj.ToString()); //输出 MySpace.Person object obj2 = app.CreateInstanceAndUnwrap("MySpace","MySpace.Person"); //创建指定程序中指定的对象,顺带执行了Unwrap方法
Console.WriteLine(obj2.ToString()); //输出 MySpace.Person ObjectHandle objHan2 = app.CreateInstanceFrom(@"D:\MySpace.dll", "MySpace.Person"); //从指定的程序集中创建类的对象
object obj3 = objHan2.Unwrap();
Console.WriteLine(obj3.ToString()); //输出 MySpace.Person //app.CreateObjRef(); app.ExecuteAssembly(@"D:\ConsoleApplication1.exe"); //执行指定文件中包含的程序集 输出0123456789
//D:\ConsoleApplication1.exe的代码如下
//static void Main(string[] args)
//{
// for (int i = 0; i < 10; i++)
// {
// Console.WriteLine(i);
// } // Console.ReadKey();
//} //下面改动一下D:\ConsoleApplication1.exe,改为在D盘下创建一个文件,并写入一段文字
app.ExecuteAssembly(@"D:\ConsoleApplication1.exe"); //运行之后在D盘下创建了一个文件,并写入文字
//static void Main(string[] args)
//{
// File.WriteAllText(@"D:\AppDomainTest.txt","测试测试");
// Console.ReadKey();
//}
//注意,此次由于有Console.ReadKey(); 因此执行到这里要按两次键盘,让app程序域执行完毕才会又回到主程序域
Assembly[] assArr = app.GetAssemblies(); //获取加载到app应用程序域中的所有程序集 foreach (var ass in assArr)
{
Console.WriteLine(ass.FullName); //诸如此类 ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
} //给定Assembly的情况下装载程序集
app.Load("MySpace");
Console.WriteLine(app.IsDefaultAppDomain()); //输出 False 是否是进程默认的应用程序域 app.SetData("data1", "我靠"); //为指定的应用程序域属性分配指定值。
object o = app.GetData("data1");
Console.WriteLine(o.ToString()); //输出 我靠 //ApplyPolicy 返回应用策略后的程序集显示名称。
//CreateComInstanceFrom(String, String) 创建指定 COM 类型的新实例。 形参指定文件的名称,该文件包含含有类型和类型名称的程序集。
//CreateObjRef 创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。 (继承自 MarshalByRefObject。)
//DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess) 以指定名称和访问模式定义动态程序集。
//DoCallBack 在另一个应用程序域中执行代码,该应用程序域由指定的委托标识。
//ExecuteAssemblyByName(String) 在给定其显示名称的情况下执行程序集。
//GetLifetimeService 检索控制此实例的生存期策略的当前生存期服务对象。 (继承自 MarshalByRefObject。)
//InitializeLifetimeService 通过防止创建租约来给予 AppDomain 无限生存期。 (重写 MarshalByRefObject.InitializeLifetimeService()。)
//IsCompatibilitySwitchSet 获取可以为 null 的布尔值,该值指示是否设置了任何兼容性开关,如果已设置,则指定是否设置了指定的兼容性开关。
//IsFinalizingForUnload 指示此应用程序域是否正在卸载以及公共语言运行时是否正在终止该域包含的对象。
//ReflectionOnlyGetAssemblies 返回已加载到应用程序域的只反射上下文中的程序集。
//SetPrincipalPolicy 指定在此应用程序域中执行时如果线程尝试绑定到用户,用户和标识对象应如何附加到该线程。
//SetThreadPrincipal 设置在以下情况下要附加到线程的默认主体对象,即当线程在此应用程序域中执行时,如果线程尝试绑定到主体这种情况。
//Unload 卸载指定的应用程序域。 Console.ReadKey();
}
}
详细参考:http://www.cnblogs.com/kissdodog/archive/2013/05/09/3069553.html
System.AppDomain类详解(二)的更多相关文章
- System.AppDomain类详解(一)
AppDomain是CLR(Common Language Runtime:公共语言运行库),它可以加载Assembly.创建对象以及执行程序. AppDomain是CLR实现代码隔离的基本机制. 每 ...
- Dedesql数据库类详解(二次开发必备教程)(转)
http://www.dedecms.com/help/development/2009/1028/1076.html 织梦DedeCMS的二次开发不仅仅是会写写织梦的标签,会制作织梦的模板.很多时候 ...
- Dedesql数据库类详解(二次开发必备教程)
其实数据库类织梦之前就有一个介绍,http://help.dedecms.com/v53/archives/functions/db/,这篇文章讲解了数据库类的一些常见的使用方法,不过没有结合例子去介 ...
- Struts2-整理笔记(二)常量配置、动态方法调用、Action类详解
1.修改struts2常量配置(3种) 第一种 在str/struts.xml中添加constant标签 <struts> <!-- 如果使用使用动态方法调用和include冲突 - ...
- JAVAEE学习——struts2_01:简介、搭建、架构、配置、action类详解和练习:客户列表
一.struts2是什么 1.概念 2.struts2使用优势以及历史 二.搭建struts2框架 1.导包 (解压缩)struts2-blank.war就会看到 2.书写Action类 public ...
- Java 枚举类详解
1. 枚举类定义 在某些情况下,一个类的对象是有限而且固定的,比如季节类,它只有4个对象,这种实例有限而且固定的类,在Java里被称为枚举类. 2. 早期实现枚举的方式 public static f ...
- URLConnection类详解-转
转-http://www.cnblogs.com/shijiaqi1066/p/3753224.html 1. URLConnection概述 URLConnection是一个抽象类,表示指向URL指 ...
- Java基础-DBCP连接池(BasicDataSource类)详解
Java基础-DBCP连接池(BasicDataSource类)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程 ...
- Java基础-进程与线程之Thread类详解
Java基础-进程与线程之Thread类详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.进程与线程的区别 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 ...
随机推荐
- cogs——1215. [Tyvj Aug11] 冗余电网
1215. [Tyvj Aug11] 冗余电网 ★ 输入文件:ugrid.in 输出文件:ugrid.out 简单对比 时间限制:1 s 内存限制:128 MB TYVJ八月月赛提高组 ...
- 洛谷——P1044 栈
P1044 栈——卡特兰数 题目背景 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈) ...
- Model、ModelMap、ModelAndView的使用和区别
1.Model的使用 数据传递:Model是通过addAttribute方法向页面传递数据的: 数据获取:JSP页面可以通过el表达式或C标签库的方法获取数据: return:return返回的是指定 ...
- C# 图片识别(支持21种语言)转
来自:http://www.cnblogs.com/stone_w/archive/2011/10/08/2202397.html 图片识别的技术到几天已经很成熟了,只是相关的资料很少,为了方便在此汇 ...
- ubuntu10.04 建V
ubuntu10.04架设vpn服 vpn 安装: pptpd:apt-get install pptpd 1. 配置网络IP地址,编辑 vim /etc/pptpd.conf ,去掉下面两行前面# ...
- C# VS如何整个项目中查找字符串
Ctrl+F打开查找对话框,然后输入查找字符串,电机右边的小三角,选择整个解决方案,就可以遍历所有文件查找指定字符了
- VC,VB程序button、图标样式美化
此处的"美化"指的不是通过代码进行美化你的程序.关于想进一步优化自己的程序界面的,最好还是去了解下SkinSharp吧.本文提及的是利用第三方资源编辑软件在不更改程序不论什么框架和 ...
- HTML5超科幻个人主页
在线演示地址:http://me.cpwl.site 备用地址:http://cpwl.sinaapp.com 部分截图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkb ...
- HDU Today HDU杭电2112【Dijkstra || SPFA】
http://acm.hdu.edu.cn/showproblem.php?pid=2112 Problem Description 经过锦囊相助,海东集团最终度过了危机,从此.HDU的发展就一直顺风 ...
- TCP从连接到释放过程全解
參考书籍:<计算机网络第5版> TCP是面向连接的协议,採用C/S模型建立连接,由client主动发起连接请求,server端允许请求的模式建立连接,通常称为三次握手建立TCP连接. 准备 ...