.Net AppDomain详解(二)
AppDomain 类
表示应用程序域,它是一个应用程序在其中执行的独立环境。 此类不能被继承。
命名空间: System
程序集: mscorlib(位于 mscorlib.dll)
[ClassInterfaceAttribute(ClassInterfaceType.None)]
[ComVisibleAttribute(true)]
public sealed class AppDomain : MarshalByRefObject, _AppDomain,
IEvidenceFactory
| 名称 | 说明 |
|---|---|
| ActivationContext |
获取当前应用程序域的激活上下文。 |
| ApplicationIdentity |
获得应用程序域中的应用程序标识。 |
| ApplicationTrust |
获取说明授予应用程序的权限以及应用程序是否拥有允许其运行的信任级别的信息。 |
| BaseDirectory |
获取基目录,它由程序集冲突解决程序用来探测程序集。 |
| CurrentDomain |
获取当前 Thread 的当前应用程序域。 |
| DomainManager |
获得初始化应用程序域时主机提供的域管理器。 |
| DynamicDirectory |
获取目录,它由程序集冲突解决程序用来探测动态创建的程序集。 |
| Evidence |
获取与该应用程序域关联的 Evidence。 |
| FriendlyName |
获取此应用程序域的友好名称。 |
| Id |
获得一个整数,该整数唯一标识进程中的应用程序域。 |
| IsFullyTrusted |
获取一个值,该值指示加载到当前应用程序域的程序集是否是以完全信任方式执行的。 |
| IsHomogenous |
获取一个值,该值指示当前应用程序域是否拥有一个为加载到该应用程序域的所有程序集授予的权限集。 |
| MonitoringIsEnabled |
获取或设置一个值,该值指示是否对当前进程启用应用程序域的 CPU 和内存监视。 一旦对进程启用了监视,则无法将其禁用。 |
| MonitoringSurvivedMemorySize |
获取上次回收后保留下来的,已知由当前应用程序域引用的字节数。 |
| MonitoringSurvivedProcessMemorySize |
获取进程中所有应用程序域的上次回收后保留下来的总字节数。 |
| MonitoringTotalAllocatedMemorySize |
获取自从创建应用程序域后由应用程序域进行的所有内存分配的总大小(以字节为单位,不扣除已回收的内存)。 |
| MonitoringTotalProcessorTime |
获取自从进程启动后所有线程在当前应用程序域中执行时所使用的总处理器时间。 |
| PermissionSet |
获取沙盒应用程序域的权限集。 |
| RelativeSearchPath |
获取基目录下的路径,在此程序集冲突解决程序应探测专用程序集。 |
| SetupInformation |
获取此实例的应用程序域配置信息。 |
| ShadowCopyFiles |
获取应用程序域是否配置为影像副本文件的指示。 |
| 名称 | 说明 |
|---|---|
| AssemblyLoad |
在加载程序集时发生。 |
| AssemblyResolve |
在对程序集的解析失败时发生。 |
| DomainUnload |
在即将卸载 AppDomain 时发生。 |
| FirstChanceException |
当托管代码抛出异常时发生,在运行时在调用堆栈中搜索应用程序域中的异常处理程序之前。 |
| ProcessExit |
当默认应用程序域的父进程退出时发生。 |
| ReflectionOnlyAssemblyResolve |
当程序集的解析在仅限反射的上下文中失败时发生。 |
| ResourceResolve |
当资源解析因资源不是程序集中的有效链接资源或嵌入资源而失败时发生。 |
| TypeResolve |
在对类型的解析失败时发生。 |
| UnhandledException |
当某个异常未被捕获时出现。 |
应用程序域,由表示AppDomain对象,帮助提供有关执行托管的代码的隔离、 卸载和安全边界。
使用应用程序域隔离可能会终止进程的任务。 如果状态AppDomain,正在执行的任务变得不稳定,AppDomain可以而不会影响进程中卸载。 进程必须运行很长一段无需重新启动时,这很重要。 你还可以使用应用程序域隔离不应共享数据的任务。
如果程序集被加载到默认应用程序域,它无法从内存中卸载过程运行时。 但是,如果您打开第二个应用程序域加载和执行程序集,程序集是卸载卸载该应用程序域时。 使用此方法最大程度减少偶尔使用大型 Dll 的长时间运行进程的工作集。
多个应用程序域可以运行在一个进程中;但是,没有应用程序域和线程之间的一对一的相关性。 多个线程可以属于单个应用程序域,并且单个应用程序域中时的给定的线程并不局限于单个应用程序域,在任何给定时间,执行线程。
使用创建应用程序域CreateDomain方法。 AppDomain实例用于加载和执行程序集 (Assembly)。 当AppDomain是不再在使用中,可以将它卸载。
AppDomain类实现的一组启用应用程序进行响应时加载的程序集,应用程序域将被卸载,或引发未经处理的异常时的事件。
有关使用应用程序域的详细信息,请参阅应用程序域。
此类实现MarshalByRefObject, _AppDomain,和IEvidenceFactory接口。
决不要创建的远程操作包装AppDomain对象。 这样可以将发布到的远程引用AppDomain,如公开方法CreateInstance与远程访问和有效地销毁该的代码访问安全性AppDomain。 恶意客户端连接到远程AppDomain无法获取任何资源的访问权限AppDomain本身具有访问权限。 不创建任何扩展的类型的远程操作包装MarshalByRefObject并实现恶意客户端无法用于绕过安全系统的方法。
小心 |
|---|
|
默认值为AppDomainSetup.DisallowCodeDownload属性是false。 此设置是不安全的服务。 若要防止服务下载部分受信任的代码,请将此属性设置为true。 |
此示例演示如何创建一个新AppDomain,新实例化中的一个类型AppDomain,以及与该类型的对象通信。 此外,此示例演示如何卸载AppDomain导致要进行垃圾回收的对象。
using System;
using System.Reflection;
using System.Threading; class Module1
{
public static void Main()
{
// Get and display the friendly name of the default AppDomain.
string callingDomainName = Thread.GetDomain().FriendlyName;
Console.WriteLine(callingDomainName); // Get and display the full name of the EXE assembly.
string exeAssembly = Assembly.GetEntryAssembly().FullName;
Console.WriteLine(exeAssembly); // Construct and initialize settings for a second AppDomain.
AppDomainSetup ads = new AppDomainSetup();
ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; ads.DisallowBindingRedirects = false;
ads.DisallowCodeDownload = true;
ads.ConfigurationFile =
AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; // Create the second AppDomain.
AppDomain ad2 = AppDomain.CreateDomain("AD #2", null, ads); // Create an instance of MarshalbyRefType in the second AppDomain.
// A proxy to the object is returned.
MarshalByRefType mbrt =
(MarshalByRefType) ad2.CreateInstanceAndUnwrap(
exeAssembly,
typeof(MarshalByRefType).FullName
); // Call a method on the object via the proxy, passing the
// default AppDomain's friendly name in as a parameter.
mbrt.SomeMethod(callingDomainName); // Unload the second AppDomain. This deletes its object and
// invalidates the proxy object.
AppDomain.Unload(ad2);
try
{
// Call the method again. Note that this time it fails
// because the second AppDomain was unloaded.
mbrt.SomeMethod(callingDomainName);
Console.WriteLine("Sucessful call.");
}
catch(AppDomainUnloadedException)
{
Console.WriteLine("Failed call; this is expected.");
}
}
} // Because this class is derived from MarshalByRefObject, a proxy
// to a MarshalByRefType object can be returned across an AppDomain
// boundary.
public class MarshalByRefType : MarshalByRefObject
{
// Call this method via a proxy.
public void SomeMethod(string callingDomainName)
{
// Get this AppDomain's settings and display some of them.
AppDomainSetup ads = AppDomain.CurrentDomain.SetupInformation;
Console.WriteLine("AppName={0}, AppBase={1}, ConfigFile={2}",
ads.ApplicationName,
ads.ApplicationBase,
ads.ConfigurationFile
); // Display the name of the calling AppDomain and the name
// of the second domain.
// NOTE: The application's thread has transitioned between
// AppDomains.
Console.WriteLine("Calling from '{0}' to '{1}'.",
callingDomainName,
Thread.GetDomain().FriendlyName
);
}
} /* This code produces output similar to the following: AppDomainX.exe
AppDomainX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
AppName=, AppBase=C:\AppDomain\bin, ConfigFile=C:\AppDomain\bin\AppDomainX.exe.config
Calling from 'AppDomainX.exe' to 'AD #2'.
Failed call; this is expected.
*/
此类型的所有公共静态(Visual Basic 中的 已共享 在 Visual Basic 中)成员都是线程安全的。不保证所有实例成员都是线程安全的。
.Net AppDomain详解(二)的更多相关文章
- .NET DLL 保护措施详解(二)关于性能的测试
先说结果: 加了缓存的结果与C#原生代码差异不大了 我对三种方式进行了测试: 第一种,每次调用均动态编译 第二种,缓存编译好的对象 第三种,直接调用原生C#代码 .net dll保护系列 ------ ...
- PopUpWindow使用详解(二)——进阶及答疑
相关文章:1.<PopUpWindow使用详解(一)——基本使用>2.<PopUpWindow使用详解(二)——进阶及答疑> 上篇为大家基本讲述了有关PopupWindow ...
- Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)
[Android布局学习系列] 1.Android 布局学习之——Layout(布局)详解一 2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数) 3.And ...
- logback -- 配置详解 -- 二 -- <appender>
附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...
- 爬虫入门之urllib库详解(二)
爬虫入门之urllib库详解(二) 1 urllib模块 urllib模块是一个运用于URL的包 urllib.request用于访问和读取URLS urllib.error包括了所有urllib.r ...
- [转]文件IO详解(二)---文件描述符(fd)和inode号的关系
原文:https://www.cnblogs.com/frank-yxs/p/5925563.html 文件IO详解(二)---文件描述符(fd)和inode号的关系 ---------------- ...
- Android View 的绘制流程之 Layout 和 Draw 过程详解 (二)
View 的绘制系列文章: Android View 的绘制流程之 Measure 过程详解 (一) Android View 绘制流程之 DecorView 与 ViewRootImpl 在上一篇 ...
- HTTPS详解二:SSL / TLS 工作原理和详细握手过程
HTTPS 详解一:附带最精美详尽的 HTTPS 原理图 HTTPS详解二:SSL / TLS 工作原理和详细握手过程 在上篇文章HTTPS详解一中,我已经为大家介绍了 HTTPS 的详细原理和通信流 ...
- Linux dts 设备树详解(二) 动手编写设备树dts
Linux dts 设备树详解(一) 基础知识 Linux dts 设备树详解(二) 动手编写设备树dts 文章目录 前言 硬件结构 设备树dts文件 前言 在简单了解概念之后,我们可以开始尝试写一个 ...
随机推荐
- citySelect省市区jQuery联动插件
参考地址:http://blog.csdn.net/qq_33556185/article/details/50704446 参考地址:http://www.lanrenzhijia.com/jque ...
- python----多继承C3算法
https://blog.csdn.net/fmblzf/article/details/52512145
- python接口自动化测试二十二:文件下载
文件下载类型: Content-Type: octets/stream 一般为文件类型:
- Jmeter录制浏览器并回放
确认证书 1.查看证书 进入Jmeter安装目录下的bin,找到ApacheJMeterTemporaryRootCA.crt 证书文件(如jmeter在安装目录中未找到,可尝试先执行下面的开始录制步 ...
- 分布式任务调度系统xxl-job搭建(基于docker)
一.简介 XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线上产品线,开箱即用. 更多介绍,请访问官网: http://w ...
- 步步为营-71-asp.net的简单练习(图片处理)
1 原有图片添加水印 1.1 封装一个类,用于获取文件路径 using System; using System.Collections.Generic; using System.IO; using ...
- Codeforces 247D Mike and Fish
Mike and Fish 我们可以把这个模型转换一下就变成有两类点,一类是X轴, 一类是Y轴, 每个点相当于对应的点之间建一条边, 如果这条边变红两点同时+1, 变蓝两点同时-1. 我们能发现这个图 ...
- zstu-4243 牛吃草
贴一发两圆相交面积模板 #include<bits/stdc++.h> #define pi acos(-1.0) using namespace std; ; double _abs(d ...
- java过滤防止sql注入过滤
/** * 过滤特殊字符 * @author: Simon * @date: 2017年8月31日 下午1:47:56 * @param str * @return */ public static ...
- poj3259 Wormholes (判负环)【spfa】(模板)
<题目链接> 题目大意: John的农场里N块地,M条路连接两块地,W个虫洞,虫洞是一条单向路,会在你离开之前把你传送到目的地,就是当你过去的时候时间会倒退Ts.我们的任务是知道会不会在从 ...
小心