.Net AppDomain详解(二)

AppDomain 类

表示应用程序域,它是一个应用程序在其中执行的独立环境。 此类不能被继承。

命名空间:   System
程序集:  mscorlib(位于 mscorlib.dll)

继承层次结构

System.Object
??System.MarshalByRefObject
????System.AppDomain

[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

获取应用程序域是否配置为影像副本文件的指示。

方法

名称 说明
AppendPrivatePath(String)

已过时。 将指定的目录名追加到专用路径列表。

ApplyPolicy(String)

返回应用策略后的程序集显示名称。

ClearPrivatePath()

已过时。 将指定专用程序集位置的路径重置为空字符串 ("")。

ClearShadowCopyPath()

已过时。 将包含影像复制的程序集的目录列表重置为空字符串 ("")。

CreateComInstanceFrom(String,?String)

创建指定 COM 类型的新实例。 形参指定文件的名称,该文件包含含有类型和类型名称的程序集。

CreateComInstanceFrom(String,?String,?Byte[],?AssemblyHashAlgorithm)

创建指定 COM 类型的新实例。 形参指定文件的名称,该文件包含含有类型和类型名称的程序集。

CreateDomain(String)

使用指定的名称新建应用程序域。

CreateDomain(String,?Evidence)

使用所提供的证据创建具有给定名称的新应用程序域。

CreateDomain(String,?Evidence,?AppDomainSetup)

使用指定的名称、证据和应用程序域设置信息创建新的应用程序域。

CreateDomain(String,?Evidence,?AppDomainSetup,?PermissionSet,?StrongName[])

使用指定的名称、证据、应用程序域设置信息、默认权限集和一组完全受信任的程序集创建新的应用程序域。

CreateDomain(String,?Evidence,?String,?String,?Boolean)

使用证据、应用程序基路径、相对搜索路径和指定是否向应用程序域中加载程序集的影像副本的形参创建具有给定名称的新应用程序域。

CreateDomain(String,?Evidence,?String,?String,?Boolean,?AppDomainInitializer,?String[])

使用证据、应用程序基路径、相对搜索路径和指定是否向应用程序域中加载程序集的影像副本的形参创建具有给定名称的新应用程序域。 指定在初始化应用程序域时调用的回调方法,以及传递回调方法的字符串实参数组。

CreateInstance(String,?String)

创建在指定程序集中定义的指定类型的新实例。

CreateInstance(String,?String,?Object[])

创建在指定程序集中定义的指定类型的新实例。 形参指定激活特性数组。

CreateInstanceAndUnwrap(String,?String)

创建指定类型的新实例。 形参指定定义类型的程序集以及类型的名称。

CreateInstanceAndUnwrap(String,?String,?Object[])

创建指定类型的新实例。 形参指定定义类型的程序集、类型的名称和激活特性的数组。

CreateInstanceFrom(String,?String)

创建在指定程序集文件中定义的指定类型的新实例。

CreateInstanceFrom(String,?String,?Boolean,?BindingFlags,?Binder,?Object[],?CultureInfo,?Object[])

创建在指定程序集文件中定义的指定类型的新实例。

CreateInstanceFrom(String,?String,?Boolean,?BindingFlags,?Binder,?Object[],?CultureInfo,?Object[],?Evidence)

已过时。 创建在指定程序集文件中定义的指定类型的新实例。

CreateInstanceFrom(String,?String,?Object[])

创建在指定程序集文件中定义的指定类型的新实例。

CreateInstanceFromAndUnwrap(String,?String)

创建在指定程序集文件中定义的指定类型的新实例。

CreateInstanceFromAndUnwrap(String,?String,?Boolean,?BindingFlags,?Binder,?Object[],?CultureInfo,?Object[])

创建在指定的程序集文件中定义的指定类型的新实例,指定是否忽略类型名称的大小写,并指定绑定特性和用于选择要创建的类型的联编程序、构造函数的自变量、区域性以及激活特性。

CreateInstanceFromAndUnwrap(String,?String,?Boolean,?BindingFlags,?Binder,?Object[],?CultureInfo,?Object[],?Evidence)

已过时。 创建在指定程序集文件中定义的指定类型的新实例。

CreateInstanceFromAndUnwrap(String,?String,?Object[])

创建在指定程序集文件中定义的指定类型的新实例。

CreateObjRef(Type)

创建包含所有生成代理用于与远程对象进行通信所需的相关信息的对象。(继承自 MarshalByRefObject。)

ExecuteAssembly(String,?String[])

使用指定的自变量执行指定文件中包含的程序集。

ExecuteAssembly(String,?String[],?Byte[],?AssemblyHashAlgorithm)

使用指定的自变量、哈希值和哈希算法执行指定文件中包含的程序集。

ExecuteAssemblyByName(AssemblyName,?Evidence,?String[])

已过时。 根据给定的 AssemblyName 使用指定的证据和实参执行程序集。

ExecuteAssemblyByName(AssemblyName,?String[])

根据给定的 AssemblyName 使用指定的参数执行程序集。

ExecuteAssemblyByName(String)

在给定其显示名称的情况下执行程序集。

ExecuteAssemblyByName(String,?String[])

在给定显示名称的情况下,使用指定自变量执行程序集。

GetAssemblies()

获取已加载到此应用程序域的执行上下文中的程序集。

GetData(String)

为指定名称获取存储在当前应用程序域中的值。

GetHashCode()

作为默认哈希函数。(继承自 Object。)

GetLifetimeService()

检索当前生存期服务对象,用于控制此实例的生存期策略。(继承自 MarshalByRefObject。)

GetType()

获取当前实例的类型。

InitializeLifetimeService()

通过防止创建租约来给予 AppDomain 无限生存期。(覆盖 MarshalByRefObject.InitializeLifetimeService()。)

IsCompatibilitySwitchSet(String)

获取可以为 null 的布尔值,该值指示是否设置了任何兼容性开关,如果已设置,则指定是否设置了指定的兼容性开关。

IsDefaultAppDomain()

返回一个值,指示应用程序域是否是进程的默认应用程序域。

IsFinalizingForUnload()

指示此应用程序域是否正在卸载以及公共语言运行时是否正在终止该域包含的对象。

Load(AssemblyName)

在给定 AssemblyName 的情况下加载 Assembly

Load(Byte[])

加载带有基于通用对象文件格式 (COFF) 的图像的 Assembly,该图像包含已发出的 Assembly

Load(Byte[],?Byte[])

加载带有基于通用对象文件格式 (COFF) 的图像的Assembly,该图像包含已发出的 Assembly。 还加载表示 Assembly 的符号的原始字节。

Load(String)

在给定其显示名称的情况下加载 Assembly

ReflectionOnlyGetAssemblies()

返回已加载到应用程序域的只反射上下文中的程序集。

SetData(String,?Object)

为指定的应用程序域属性分配指定值。

SetData(String,?Object,?IPermission)

将指定值分配给指定应用程序域属性,检索该属性时要求调用方具有指定权限。

SetPrincipalPolicy(PrincipalPolicy)

指定在此应用程序域中执行时如果线程尝试绑定到用户,用户和标识对象应如何附加到该线程。

SetThreadPrincipal(IPrincipal)

设置在以下情况下要附加到线程的默认主体对象,即当线程在此应用程序域中执行时,如果线程尝试绑定到主体这种情况。

ToString()

获取一个字符串表示,包含应用程序域友好名称和任意上下文策略。(覆盖 Object.ToString()。)

Unload(AppDomain)

卸载指定的应用程序域。

事件

名称 说明
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详解(一)

C#如何测试代码运行时间

C# 访问操作注册表整理

时间: 2024-10-20 00:23:28

.Net AppDomain详解(二)的相关文章

AppDomain 详解二【转】-C#中动态加载和卸载DLL

在C++中加载和卸载DLL是一件很容易的事,LoadLibrary和FreeLibrary让你能够轻易的在程序中加载DLL,然后在任何地方 卸载.在C#中我们也能使用Assembly.LoadFile实现动态加载DLL,但是当你试图卸载时,你会很惊讶的发现Assembly没有提供任何 卸载的方法.这是由于托管代码的自动垃圾回收机制会做这件事情,所以C#不提供释放资源的函数,一切由垃圾回收来做. 这引发了一个问题,用Assembly加载的DLL可能只在程序结束的时候才会被释放,这也意味着在程序运行

UINavigationController详解二(转)页面切换和SegmentedController

原文出自:http://blog.csdn.net/totogo2010/article/details/7682433,非常感谢. 1.RootView 跳到SecondView 首先我们需要新一个View.新建SecondView,按住Command键然后按N,弹出新建页面,我们新建SecondView 2.为Button 添加点击事件,实现跳转 在RootViewController.xib中和RootViewController.h文件建立连接 在RootViewController.m

Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)

[Android布局学习系列]   1.Android 布局学习之——Layout(布局)详解一   2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)   3.Android 布局学习之——LinearLayout的layout_weight属性   4.Android 布局学习之——LinearLayout属性baselineAligned的作用及baseline    Layout Parameters(布局参数): 在XML文件中,我们经常看到类似与lay

CSS3中的弹性流体盒模型技术详解(二)

在上一篇文章<CSS3中的弹性流体盒模型技术详解(一)>里,我给大家列出了,从css1到css3各版本中盒子模型的基本元素.本篇我会把余下的属性进行详细讲解. box-pack 作用:用来规定子元素在盒子内的水平空间分配方式 box-pack 语法:box-pack: start | end | center | justify; start 对于正常方向的框,首个子元素的左边缘吸附在盒子的左边框显示 对于相反方向的框,最后子元素的右边缘吸附在盒子的右边框显示 end 对于正常方向的框,最后子

php学习之道:WSDL详解(二)

3.定义服务使用的逻辑消息 当服务的操作被调用时,服务被定义为消息交换.在wsdl文档中,这些消息被定义message元素.这些消息由称之为part元素的部分组成. 一个服务的操作,通过指定逻辑消息的方式来定义.当操作被调用时,逻辑消息被交换.(也就是说,逻辑消息代表了服务的操作)这些逻辑消息,将在网络上传输的数据定义为xml文档.他包含了所有的参数,这些参数是方法调用的一部分.(也就是说,逻辑消息里的参数,是操作对应方法的参数集合) 消息和参数列表:每一个被服务暴露的操作能且仅能有一个输入消息

LinearLayout详解二:从其父类View说起

这个View类说来就话长了,但我们又不得不说,要说呢,就得说的彻底,要让大家看得一清二楚,明明白白.所以我们就从源代码角度来看一个view是如何被加载的吧. 如果大家不知道怎么下载android的源代码,或者说懒得去下载(因为源代码确实比较大,大概有10G)的话,教大家几个取巧的办法: 1.直接在google中输入"android view.java"即可.这种方法成功率非常高,一般android的比较重要的类都能搜到. 2.给大家提供一个人家用于放源码的的git:[email pro

jquery validate 详解二

原文:http://blog.sina.com.cn/s/blog_608475eb0100h3h2.html 这里只是第二篇,前面的内容请参阅上一篇 五.常用方法及注意问题 1.用其他方式替代默认的SUBMIT 1 $().ready(function() { 2 $("#signupForm").validate({ 3 submitHandler:function(form){ 4 alert("submitted"); 5 form.submit(); 6

cocos2dx 启动过程详解二:内存管理和回调

在上一篇的第二部分中,我们有一句代码待解释的: // Draw the Scene void CCDirector::drawScene(void) { -- //tick before glClear: issue #533 if (! m_bPaused) //暂停 { m_pScheduler->update(m_fDeltaTime);   //待会会解释这里的内容 } -- } 这里是一个update函数,经常会写像this->schedule(schedule_selector(X

PopUpWindow使用详解(二)——进阶及答疑

相关文章:1.<PopUpWindow使用详解(一)——基本使用>2.<PopUpWindow使用详解(二)——进阶及答疑> 上篇为大家基本讲述了有关PopupWindow的基本使用,但还有几个相关函数还没有讲述,我们这篇将着重看看这几个函数的用法并结合源码来讲讲具体原因,最后是有关PopupWindow在使用时的疑问,给大家讲解一下. 一.常用函数讲解 这段将会给大家讲下下面几个函数的意义及用法,使用上篇那个带背景的例子为基础. [java] view plain copy pu