System.AppDomain 类

方法描述

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

语法定义(C# System.AppDomain 类 的用法)

[ClassInterfaceAttribute(ClassInterfaceType.None)]
[ComVisibleAttribute(true)]
public sealed class AppDomain : MarshalByRefObject, 
	_AppDomain, IEvidenceFactory

构造函数

构造函数名称 构造函数描述

成员/方法

方法名称 方法描述
AppendPrivatePath 已过时。将指定的目录名追加到专用路径列表。
ApplyPolicy 返回应用策略后的程序集显示名称。
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[]) 创建在指定程序集中定义的指定类型的新实例。 形参指定激活特性数组。
CreateInstance(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[]) 创建在指定程序集中定义的指定类型的新实例。 形参指定联编程序、绑定标志、构造函数实参、用于解释实参的特定于区域性的信息,以及可选激活特性。
CreateInstance(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[], Evidence) 已过时。创建在指定程序集中定义的指定类型的新实例。 形参指定联编程序、绑定标志、构造函数实参、特定于区域性的信息,这些信息用于解释实参、激活特性和授权,以创建类型。
CreateInstanceAndUnwrap(String, String) 创建指定类型的新实例。 形参指定定义类型的程序集以及类型的名称。
CreateInstanceAndUnwrap(String, String, Object[]) 创建指定类型的新实例。 形参指定定义类型的程序集、类型的名称和激活特性的数组。
CreateInstanceAndUnwrap(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[]) 创建在指定的程序集中定义的指定类型的新实例,指定是否忽略类型名称的大小写,并指定绑定特性和用于选择要创建的类型的联编程序、构造函数的参数、区域性以及激活特性。
CreateInstanceAndUnwrap(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[], Evidence) 已过时。创建指定类型的新实例。 形参指定类型的名称以及查找和创建该类型的方式。
CreateInstanceFrom(String, String) 创建在指定程序集文件中定义的指定类型的新实例。
CreateInstanceFrom(String, String, Object[]) 创建在指定程序集文件中定义的指定类型的新实例。
CreateInstanceFrom(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[]) 创建在指定程序集文件中定义的指定类型的新实例。
CreateInstanceFrom(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[], Evidence) 已过时。创建在指定程序集文件中定义的指定类型的新实例。
CreateInstanceFromAndUnwrap(String, String) 创建在指定程序集文件中定义的指定类型的新实例。
CreateInstanceFromAndUnwrap(String, String, Object[]) 创建在指定程序集文件中定义的指定类型的新实例。
CreateInstanceFromAndUnwrap(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[]) 创建在指定的程序集文件中定义的指定类型的新实例,指定是否忽略类型名称的大小写,并指定绑定特性和用于选择要创建的类型的联编程序、构造函数的参数、区域性以及激活特性。
CreateInstanceFromAndUnwrap(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[], Evidence) 已过时。创建在指定程序集文件中定义的指定类型的新实例。
CreateObjRef 创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。 (继承自 MarshalByRefObject。)
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess) 以指定名称和访问模式定义动态程序集。
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, IEnumerable) 使用指定的名称、访问模式和自定义特性定义动态程序集。
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, Evidence) 已过时。使用指定名称、访问模式和证据定义动态程序集。
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String) 使用指定名称、访问模式和存储目录定义动态程序集。
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, IEnumerable, SecurityContextSource) 定义具有指定名称、访问模式和自定义特性的动态程序集,并将指定源用于动态程序集的安全上下文。
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence) 已过时。使用指定名称、访问模式、存储目录和证据定义动态程序集。
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, PermissionSet, PermissionSet, PermissionSet) 已过时。使用指定名称、访问模式和权限请求定义动态程序集。
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Boolean, IEnumerable) 使用指定名称、访问模式、存储目录和同步选项定义动态程序集。
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, Evidence, PermissionSet, PermissionSet, PermissionSet) 已过时。使用指定名称、访问模式、证据和权限请求定义动态程序集。
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, PermissionSet, PermissionSet, PermissionSet) 已过时。使用指定名称、访问模式、存储目录和权限请求定义动态程序集。
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence, PermissionSet, PermissionSet, PermissionSet) 已过时。使用指定名称、访问模式、存储目录、证据和权限请求定义动态程序集。
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence, PermissionSet, PermissionSet, PermissionSet, Boolean) 已过时。使用指定名称、访问模式、存储目录、证据、权限请求和同步选项定义动态程序集。
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence, PermissionSet, PermissionSet, PermissionSet, Boolean, IEnumerable) 已过时。使用指定的名称、访问模式、存储目录、证据、权限请求、同步选项和自定义特性定义动态程序集。
DoCallBack 在另一个应用程序域中执行代码,该应用程序域由指定的委托标识。
Equals(Object) 确定指定的 Object 是否等于当前的 Object。 (继承自 Object。)
ExecuteAssembly(String) 执行指定文件中包含的程序集。
ExecuteAssembly(String, Evidence) 已过时。使用指定的证据执行指定文件中包含的程序集。
ExecuteAssembly(String, String[]) 使用指定的参数执行指定文件中包含的程序集。
ExecuteAssembly(String, Evidence, String[]) 已过时。使用指定的证据和实参执行指定文件中包含的程序集。
ExecuteAssembly(String, String[], Byte[], AssemblyHashAlgorithm) 使用指定的参数、哈希值和哈希算法执行指定文件中包含的程序集。
ExecuteAssembly(String, Evidence, String[], Byte[], AssemblyHashAlgorithm) 已过时。使用指定的证据、参数、哈希值和哈希算法执行指定文件中包含的程序集。
ExecuteAssemblyByName(String) 在给定其显示名称的情况下执行程序集。
ExecuteAssemblyByName(AssemblyName, String[]) 根据给定的 AssemblyName 使用指定的参数执行程序集。
ExecuteAssemblyByName(String, Evidence) 已过时。在给定显示名称的情况下,使用指定证据执行程序集。
ExecuteAssemblyByName(String, String[]) 在给定显示名称的情况下,使用指定参数执行程序集。
ExecuteAssemblyByName(AssemblyName, Evidence, String[]) 已过时。根据给定的 AssemblyName 使用指定的证据和实参执行程序集。
ExecuteAssemblyByName(String, Evidence, String[]) 已过时。在给定其显示名称的情况下,使用指定证据和实参执行程序集。
Finalize 允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。 (继承自 Object。)
GetAssemblies 获取已加载到此应用程序域的执行上下文中的程序集。
GetCurrentThreadId 已过时。获取当前线程标识符。
GetData 为指定名称获取存储在当前应用程序域中的值。
GetHashCode 用作特定类型的哈希函数。 (继承自 Object。)
GetLifetimeService 检索控制此实例的生存期策略的当前生存期服务对象。 (继承自 MarshalByRefObject。)
GetType 获取当前实例的类型。 在 XNA Framework3.0GetType()。
InitializeLifetimeService 通过防止创建租约来给予 AppDomain 无限生存期。 (重写 MarshalByRefObject.InitializeLifetimeService()。)
IsCompatibilitySwitchSet 获取可以为 null 的布尔值,该值指示是否设置了任何兼容性开关,如果已设置,则指定是否设置了指定的兼容性开关。
IsDefaultAppDomain 返回一个值,指示应用程序域是否是进程的默认应用程序域。
IsFinalizingForUnload 指示此应用程序域是否正在卸载以及公共语言运行时是否正在终止该域包含的对象。
Load(AssemblyName) 在给定 AssemblyName 的情况下加载 Assembly。
Load(Byte[]) 加载带有基于通用对象文件格式 (COFF) 的图像的 Assembly,该图像包含已发出的 Assembly。
Load(String) 在给定其显示名称的情况下加载 Assembly。
Load(AssemblyName, Evidence) 已过时。在给定 AssemblyName 的情况下加载 Assembly。
Load(Byte[], Byte[]) 加载带有基于通用对象文件格式 (COFF) 的图像的 Assembly,该图像包含已发出的 Assembly。 还加载表示 Assembly 的符号的原始字节。
Load(String, Evidence) 已过时。在给定其显示名称的情况下加载 Assembly。
Load(Byte[], Byte[], Evidence) 已过时。加载带有基于通用对象文件格式 (COFF) 的图像的 Assembly,该图像包含已发出的 Assembly。 还加载表示 Assembly 的符号的原始字节。
MemberwiseClone() 创建当前 Object 的浅表副本。 (继承自 Object。)
MemberwiseClone(Boolean) 创建当前 MarshalByRefObject 对象的浅表副本。 (继承自 MarshalByRefObject。)
ReflectionOnlyGetAssemblies 返回已加载到应用程序域的只反射上下文中的程序集。
SetAppDomainPolicy 已过时。为此应用程序域确定安全策略级别。
SetCachePath 已过时。确定指定目录路径为对程序集进行影像复制的位置。
SetData(String, Object) 为指定的应用程序域属性分配指定值。
SetData(String, Object, IPermission) 将指定值分配给指定应用程序域属性,检索该属性时要求调用方具有指定权限。
SetDynamicBase 已过时。建立指定的目录路径,作为存储和访问动态生成的文件的子目录的基目录。
SetPrincipalPolicy 指定在此应用程序域中执行时如果线程尝试绑定到用户,用户和标识对象应如何附加到该线程。
SetShadowCopyFiles 已过时。打开影像复制功能。
SetShadowCopyPath 已过时。确定指定目录路径为要进行影像复制的程序集的位置。
SetThreadPrincipal 设置在以下情况下要附加到线程的默认主体对象,即当线程在此应用程序域中执行时,如果线程尝试绑定到主体这种情况。
ToString 获取一个字符串表示,包含应用程序域友好名称和任意上下文策略。 (重写 Object.ToString()。)
Unload 卸载指定的应用程序域。

提示和注释

应用程序域(由 AppDomain 对象表示)为执行托管代码提供隔离、卸载和安全边界。

使用应用程序域隔离可能终止进程的任务。 如果正在执行任务的 AppDomain 的状态变得不稳定,则可以卸载 AppDomain,但不会影响进程。 当进程必须不重新启动而长时间运行时,这一点很重要。 还可使用应用程序域隔离不应共享数据的任务。

如果程序集被加载到默认应用程序域中,则当进程运行时将无法从内存中卸载该程序集。 但是,如果打开另一个应用程序域来加载和执行程序集,则卸载该应用程序域时也会同时卸载程序集。 使用此技术最小化长时间运行的进程的工作集,这些进程偶尔会使用大型 DLL。

多个应用程序域可以在一个进程中运行;但是,在应用程序域和线程之间没有一对一的关联。 多个线程可以属于一个应用程序域,尽管给定的线程并不局限于一个应用程序域,但在任何给定时间,线程都在一个应用程序域中执行。

使用 CreateDomain 方法创建应用程序域。 AppDomain 实例用于加载和执行程序集 (Assembly)。 当不再使用 AppDomain 时,可以将它卸载。

AppDomain 类实现一组事件,这些事件使应用程序可以在加载程序集、要卸载应用程序域或引发未经处理的异常时进行响应。

有关使用应用程序域的更多信息,请参见 应用程序域。

此类实现 MarshalByRefObject、_AppDomain 和 IEvidenceFactory 接口。

在任何情况下都不应创建 AppDomain 对象的可远程控制的包装。 这样做可发布对该 AppDomain 的远程引用,将诸如 CreateInstance 方法向远程访问公开,并有效损坏该 AppDomain 的代码访问安全性。 连接到远程 AppDomain 的恶意客户端可以获得对 AppDomain 本身可访问的所有资源的访问权。 您不应为任何以下类型创建可远程控制的包装:扩展 MarshalByRefObject 的类型和实现恶意客户端可用来绕过安全系统的方法的类型。

警告

AppDomainSetup.DisallowCodeDownload 属性的默认值为 false。 此设置对于服务是不安全的。 若要防止服务下载部分受信任的代码,请将此属性设置为 true。

Topic

Location

如何:将程序集加载到应用程序域中.NET Framework:编程基础

如何:配置应用程序域.NET Framework:编程基础

如何:卸载应用程序域.NET Framework:编程基础

如何:创建应用程序域.NET Framework:编程基础

如何:配置应用程序域.NET Framework:编程基础

如何:将程序集加载到应用程序域中.NET Framework:编程基础

如何:创建应用程序域.NET Framework:编程基础

如何:卸载应用程序域.NET Framework:编程基础

System.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 = 
            System.Environment.CurrentDirectory;
        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.
 */

继承层次结构

System.Object

System.MarshalByRefObject

System.AppDomain

命名空间

namespace: System

程序集: mscorlib(在 mscorlib.dll 中)

线程安全

此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。

版本信息

.NET Framework 受以下版本支持:4、3.5、3.0、2.0、1.1、1.0 .NET Framework Client Profile 受以下版本支持:4、3.5 SP1

适用平台

Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2 .NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。