.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文件 前言 在简单了解概念之后,我们可以开始尝试写一个 ...
随机推荐
- ocp linux 基础要点
基本命令: 创建/修改/删除用户 useradd/usermod/userdel 创建/修改/删除用户组 groupadd/groupmod/groupdel 修改所属用户/所属用户 ...
- Oracle12c 性能优化攻略:攻略1-1:创建具有最优性能的数据库
一:章节前言 本章着眼于影响表中数据存储性能的数据库特性. 表的性能部分取决于在创建之前所应用的数据库特性.例如:在最初创建数据库时采用的物理存储特性以及相关的表空间都会在后来影响表的性能.类似地,表 ...
- HTTP2.0 简明笔记
前言 RFC2616发布以来,一直是互联网发展的基石.HTTP协议也成为了可以在任何领域使用的核心协议,基于这个协议人们设计和部署了越来越多的应用.HTTP的简单本质是其快速发展的关键,但随着越来越多 ...
- C++ code:指针类型(pointer types)
#include <iostream> using namespace std; int main() { float f = 34.5; int *ip = reinterpret_ca ...
- PHP数学常用函数
PHP数学常用函数 函数名 描述 实例 abs() 求绝对值 $abs = abs(-4.2); //4.2 fmod() 浮点数取余 $x = 5.7;$y = 1.3;$r = fmod($x, ...
- 【C++ Primer | 06】 函数
contexpr函数 const用于运行期常量,constexpr用于编译期常量 • [test1.cpp] #include <iostream> using namespace std ...
- 一份针对nginx的内核优化参数
首先,需要修改/etc/sysctl.conf来更改内核参数.例如,最常用的配置: # ·file-max:这个参数表示进程(比如一个worker进程)可以同时打开的最大句柄数,这个参数直接限制最大并 ...
- #6【bzoj4321】queue2 dp
题目描述 n 个沙茶,被编号 1~n.排完队之后,每个沙茶希望,自己的相邻的两人只要无一个人的编号和自己的编号相差为 1(+1 或-1)就行: 现在想知道,存在多少方案满足沙茶们如此不苛刻的条件. ...
- openstack学习-KeyStone安装(二)
一.安装keystone # yum install -y openstack-keystone httpd mod_wsgi memcached python-memcached 二.设置Memca ...
- 自适应阈值二值化之最大类间方差法(大津法,OTSU)
最大类间方差法是由日本学者大津(Nobuyuki Otsu)于1979年提出的,是一种自适应的阈值确定的方法,又叫大津法,简称OTSU.它是按图像的灰度特性,将图像分成背景和目标2部分.背景和目标之间 ...
小心