每当.NET项目受到。在.NET项目被。

在.NET项目中,在.NET项目中

   对于.NET项目,我们采取于多之分布式结构来Webservice,.Net
remoting,MSMQ,WCF,WebAPI等等,我们于使用这些框架的时,从这些分布式框架中拿走了老大好的用户体验。在.NET项目面临,分布式架构对项目的开支也有很老之效率提升。

一.AppDomain解析:

   
 AppDomain在多场所都是叫翻译啊“应用程序域”,在本文中呢拿利用即时同样翻。对于.NET的开发者,对于CLR应该是极熟悉而了,CLR类似于java的JVM。在CLR中,AppDomain规定了代码的执行范围,提供了不当隔离的水准,提供了一个平安隔离度,并且存有自己的资源。AppDomain的切切实实效果,有如下图:

  

三.程序集操作实例:

using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;

namespace AppDomainToolkit
{

    /// <summary>
    /// 用于确定加载器应加载哪些加载上下文程序集。
    /// </summary>
    public enum LoadMethod
    {
        /// <summary>
        /// 将程序集加载到LoadFrom上下文中,这将使程序集及其所有引用被发现
                 ///并加载到目标应用程序域中。 尽管它对DLL地狱的倾向,这可能是去的方式
                 /// default,只要确保将应用程序的基本目录传递给AssemblyResolver实例等
                 ///可以正确解析引用。 这也允许同时加载同名的多个程序集
                 ///维护单独的文件名。 这是推荐的方式。
        /// </summary>
        LoadFrom,

        /// <summary>
        /// 使用原始文件名将组合件加载到内存中。 这将以匿名方式加载程序集,因此它不会有
                 ///一个加载上下文。 使用这个,如果你想要的位加载,但确保通过这个文件所在的目录
                 /// AssemblyResolver实例,以便您可以再次找到它。 这是类似于LoadFrom,除非你没有得到免费
                 ///通过融合查找已经存在的程序集名称。 使用它可以更好地控制汇编文件加载。
        /// </summary>
        LoadFile,

        /// <summary>
        /// 使用原始文件名将目标程序集的位加载到内存中。 这本质上是一个动态组件
                 ///为所有的CLR关心。 你将永远不能找到这个与程序集解析器,所以不要使用这,除非你看
                 ///按名称。 小心这一个。
        /// </summary>
        LoadBits
    }

    /// <summary>
    /// 这个类将会把程序集加载到它加载到的任何应用程序域中。 这只是一个简单的方便
    /// wrapper环绕静态Assembly.Load *方法,主要的好处是能够加载程序集
    ///匿名按位。 当您以这种方式加载程序集时,不会有任何DLL文件的锁定。
    /// </summary>
    public class AssemblyLoader : MarshalByRefObject, IAssemblyLoader
    {
        #region Public Methods

        /// <inheritdoc /> 
        /// <remarks>
        /// 如果此实例的LoadMethod设置为LoadBits,并且PDB文件的路径未指定,那么我们将尝试猜测
                 ///到PDB的路径并加载它。 注意,如果一个程序集被加载到内存中而没有调试符号,那么
                 /// image将被抛出。 警惕这个。 使用LoadBits方法加载程序集不会锁定
                 /// DLL文件,因为整个程序集被加载到内存中并且文件句柄被关闭。 但是,
                 ///以这种方式加载的程序集不会有与之关联的位置,因此您必须键入程序集
                 ///它的强名。 当将同一程序集的多个版本加载到一个程序集时,这可能会导致问题
                 ///应用程序域。
        /// </remarks>
        public Assembly LoadAssembly(LoadMethod loadMethod, string assemblyPath, string pdbPath = null)
        {
            Assembly assembly = null;
            switch (loadMethod)
            {
                case LoadMethod.LoadFrom:
                    assembly = Assembly.LoadFrom(assemblyPath);
                    break;
                case LoadMethod.LoadFile:
                    assembly = Assembly.LoadFile(assemblyPath);
                    break;
                case LoadMethod.LoadBits:

                    // Attempt to load the PDB bits along with the assembly to avoid image exceptions.
                    pdbPath = string.IsNullOrEmpty(pdbPath) ? Path.ChangeExtension(assemblyPath, "pdb") : pdbPath;

                    // Only load the PDB if it exists--we may be dealing with a release assembly.
                    if (File.Exists(pdbPath))
                    {
                        assembly = Assembly.Load(
                            File.ReadAllBytes(assemblyPath),
                            File.ReadAllBytes(pdbPath));
                    }
                    else
                    {
                        assembly = Assembly.Load(File.ReadAllBytes(assemblyPath));
                    }

                    break;
                default:
                    // In case we upadate the enum but forget to update this logic.
                    throw new NotSupportedException("The target load method isn't supported!");
            }

            return assembly;
        }

        /// <inheritdoc />
        /// <remarks>
        /// 这个实现将执行目标程序集的尽力负载,它是必需的引用
                 ///进入当前应用程序域。 .NET框架在我们允许使用的调用上锁定我们
                 ///当加载这些程序集时,所以我们需要依赖于AssemblyResolver实例附加的
                 /// AppDomain为了加载我们想要的方式。
        /// </remarks>
        public IList<Assembly> LoadAssemblyWithReferences(LoadMethod loadMethod, string assemblyPath)
        {
            var list = new List<Assembly>();
            var assembly = this.LoadAssembly(loadMethod, assemblyPath);
            list.Add(assembly);

            foreach (var reference in assembly.GetReferencedAssemblies())
            {
                list.Add(Assembly.Load(reference));
            }

            return list;
        }

        /// <inheritdoc />
        /// <remarks>
        /// Just a simple call to AppDomain.CurrentDomain.GetAssemblies(), nothing more.
        /// </remarks>
        public Assembly[] GetAssemblies()
        {
            return AppDomain.CurrentDomain.GetAssemblies();
        }

        #endregion
    }
}

 
 很多口会面问,这些分布式框架的底色原理是呀吧?恐怕谁为不敢轻言几词就可描述了,在这博文系列被,就是简的叙述一下这些分布式结构的脚实现原理。

 
 于脚下之类型支付被,分布式开发都逐步变为主流。一个类只要没有以分布式架构,都无好意思跟他人说立刻是一个完全的种类。这句话虽然有些偏激,但是趁人们对效率的求以加强,以及活要提升用户体验。只有当软件项目之效率和经验完高质量,才可博得用户与市场。

   1.AppDomain概述:

     
AppDomain类似与网的经过,进程是出操作系统进行创办,AppDomain是由于CLR进行创办。一个加的AppDomain必须驻留在一个操作系统的进程面临,而一个加的长河可以借宿多只AppDomain。有如下图:

   

     
如达到图所示,一个对象正好存放于一个AppDomain种,值吗如出一辙。一个AppDomain中的对象引用得是援同一AppDomain中之对象,AppDomain的行为就是类似有和谐个人的地址空间。如果简单独AppDomain需要运用一个路,必须也每个AppDomain分别初始化和分配一蹩脚品种。必须也各个用到花色的AppDomain分别加载与初始化一坏品种的章程以及次集。进程种之次第AppDomain要保障项目的不比拷贝。对于项目的静态子类,每个AppDomain都来那协调之私房副本。

     AppDomain的资源有如图:

     
对于应用AppDomain的资源为加载,一直以内存中,卸载AppDomain资源是唯一卸载模块或者程序集的路线,卸载AppDomain资源为是回收类型静态字段所占据内存的唯一方法。

   
 在面提到了操作系统的线程与AppDomain类似,在CLR中定义了System.Threading.Thread,在AppDomain中意味着也而调度的实业,在此地提出一个初的定义,那即便是“软线程”和“硬线程”,顾名思义,操作系统的线程被誉为“硬线程”,CLR中的System.Threading.Thread被叫作“软线程”。一个CLR软线程对象驻留在一个规定的AppDomain中;一个加的AppDomain可能发生差不多个软线程对象。在眼前的CLR中,对于给定的AppDomain,硬线程至多生一个软线程对象属于他,如果一个硬线程运行在多个AppDomain中,每个AppDomain都见面产生一个显然的软线程对象属于该线程。当给定的硬线程进入AppDomain后,就会见赢得相同的软线程对象。

 
 很多丁会见咨询,这些分布式框架的底色原理是呀啊?恐怕谁为非敢轻言几词就可以描述了,在此博文系列被,就是简的叙述一下这些分布式结构的脚实现原理。

   对于.NET项目,我们采用比较多之分布式结构发生Webservice,.Net
remoting,MSMQ,WCF,WebAPI等等,我们当利用这些框架的时,从这些分布式框架中获得了异常好的用户体验。在.NET项目面临,分布式架构对项目的支出也时有发生特别死之效率提升。

四.总结:

 
 本文主要教授了应用程序域的连带概念,本系列重大出口解.NET对象的跨应用程序域的传递,由于规划应用程序域的始末,所以本文主要教授了一些基本概念,以及部分主导的靶子,对于应用程序域包含的次集的有关内容将当底下进行操作。在事实上的品类被,很少直接沾操作应用程序域,比较多之凡直接操作程序集,所以当本文的最终给起了一个虽暗淡的次序集的操作方法。

 
 以眼前的类开发被,分布式开发已逐渐成为主流。一个路而没有使分布式架构,都非好意思跟别人说这是一个完全的花色。这词话则小偏激,但是就人们对效率的要求于增强,以及活要提升用户体验。只有以软件类之效率及体验完高质量,才堪获用户以及市场。

   1.AppDomain概述:

     
AppDomain类似与网的历程,进程是有操作系统进行创办,AppDomain是由CLR进行创办。一个加以的AppDomain必须驻留在一个操作系统的进程面临,而一个加以的长河可以借宿多独AppDomain。有如下图:

   

     
如齐图所示,一个对象正好存放于一个AppDomain种,值吗一律。一个AppDomain中之靶子引用得是援引同一AppDomain中的对象,AppDomain的所作所为就是象是有所和谐个人的地址空间。如果简单个AppDomain需要使用一个路,必须为每个AppDomain分别初始化和分红一糟糕品种。必须为顺序用到路的AppDomain分别加载与初始化一坏品种的章程和次序集。进程种的逐条AppDomain要维护项目的不同拷贝。对于项目的静态子类,每个AppDomain都起那协调的民用副本。

     AppDomain的资源有如图:

     
对于应用AppDomain的资源给加载,一直于内存中,卸载AppDomain资源是绝无仅有卸载模块或者程序集的路,卸载AppDomain资源为是回收类型静态字段所占内存的唯一方法。

   
 在地方提到了操作系统的线程与AppDomain类似,在CLR中定义了System.Threading.Thread,在AppDomain中意味着也而调度的实体,在此提出一个初的概念,那即便是“软线程”和“硬线程”,顾名思义,操作系统的线程被誉为“硬线程”,CLR中的System.Threading.Thread被叫作“软线程”。一个CLR软线程对象驻留在一个确定的AppDomain中;一个加的AppDomain可能出差不多只软线程对象。在此时此刻之CLR中,对于给定的AppDomain,硬线程至多出一个软线程对象属于他,如果一个硬线程运行于差不多单AppDomain中,每个AppDomain都见面发生一个显著的软线程对象属于该线程。当给定的硬线程进入AppDomain后,就见面得到同的软线程对象。

三.程序集操作实例:

using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;

namespace AppDomainToolkit
{

    /// <summary>
    /// 用于确定加载器应加载哪些加载上下文程序集。
    /// </summary>
    public enum LoadMethod
    {
        /// <summary>
        /// 将程序集加载到LoadFrom上下文中,这将使程序集及其所有引用被发现
                 ///并加载到目标应用程序域中。 尽管它对DLL地狱的倾向,这可能是去的方式
                 /// default,只要确保将应用程序的基本目录传递给AssemblyResolver实例等
                 ///可以正确解析引用。 这也允许同时加载同名的多个程序集
                 ///维护单独的文件名。 这是推荐的方式。
        /// </summary>
        LoadFrom,

        /// <summary>
        /// 使用原始文件名将组合件加载到内存中。 这将以匿名方式加载程序集,因此它不会有
                 ///一个加载上下文。 使用这个,如果你想要的位加载,但确保通过这个文件所在的目录
                 /// AssemblyResolver实例,以便您可以再次找到它。 这是类似于LoadFrom,除非你没有得到免费
                 ///通过融合查找已经存在的程序集名称。 使用它可以更好地控制汇编文件加载。
        /// </summary>
        LoadFile,

        /// <summary>
        /// 使用原始文件名将目标程序集的位加载到内存中。 这本质上是一个动态组件
                 ///为所有的CLR关心。 你将永远不能找到这个与程序集解析器,所以不要使用这,除非你看
                 ///按名称。 小心这一个。
        /// </summary>
        LoadBits
    }

    /// <summary>
    /// 这个类将会把程序集加载到它加载到的任何应用程序域中。 这只是一个简单的方便
    /// wrapper环绕静态Assembly.Load *方法,主要的好处是能够加载程序集
    ///匿名按位。 当您以这种方式加载程序集时,不会有任何DLL文件的锁定。
    /// </summary>
    public class AssemblyLoader : MarshalByRefObject, IAssemblyLoader
    {
        #region Public Methods

        /// <inheritdoc /> 
        /// <remarks>
        /// 如果此实例的LoadMethod设置为LoadBits,并且PDB文件的路径未指定,那么我们将尝试猜测
                 ///到PDB的路径并加载它。 注意,如果一个程序集被加载到内存中而没有调试符号,那么
                 /// image将被抛出。 警惕这个。 使用LoadBits方法加载程序集不会锁定
                 /// DLL文件,因为整个程序集被加载到内存中并且文件句柄被关闭。 但是,
                 ///以这种方式加载的程序集不会有与之关联的位置,因此您必须键入程序集
                 ///它的强名。 当将同一程序集的多个版本加载到一个程序集时,这可能会导致问题
                 ///应用程序域。
        /// </remarks>
        public Assembly LoadAssembly(LoadMethod loadMethod, string assemblyPath, string pdbPath = null)
        {
            Assembly assembly = null;
            switch (loadMethod)
            {
                case LoadMethod.LoadFrom:
                    assembly = Assembly.LoadFrom(assemblyPath);
                    break;
                case LoadMethod.LoadFile:
                    assembly = Assembly.LoadFile(assemblyPath);
                    break;
                case LoadMethod.LoadBits:

                    // Attempt to load the PDB bits along with the assembly to avoid image exceptions.
                    pdbPath = string.IsNullOrEmpty(pdbPath) ? Path.ChangeExtension(assemblyPath, "pdb") : pdbPath;

                    // Only load the PDB if it exists--we may be dealing with a release assembly.
                    if (File.Exists(pdbPath))
                    {
                        assembly = Assembly.Load(
                            File.ReadAllBytes(assemblyPath),
                            File.ReadAllBytes(pdbPath));
                    }
                    else
                    {
                        assembly = Assembly.Load(File.ReadAllBytes(assemblyPath));
                    }

                    break;
                default:
                    // In case we upadate the enum but forget to update this logic.
                    throw new NotSupportedException("The target load method isn't supported!");
            }

            return assembly;
        }

        /// <inheritdoc />
        /// <remarks>
        /// 这个实现将执行目标程序集的尽力负载,它是必需的引用
                 ///进入当前应用程序域。 .NET框架在我们允许使用的调用上锁定我们
                 ///当加载这些程序集时,所以我们需要依赖于AssemblyResolver实例附加的
                 /// AppDomain为了加载我们想要的方式。
        /// </remarks>
        public IList<Assembly> LoadAssemblyWithReferences(LoadMethod loadMethod, string assemblyPath)
        {
            var list = new List<Assembly>();
            var assembly = this.LoadAssembly(loadMethod, assemblyPath);
            list.Add(assembly);

            foreach (var reference in assembly.GetReferencedAssemblies())
            {
                list.Add(Assembly.Load(reference));
            }

            return list;
        }

        /// <inheritdoc />
        /// <remarks>
        /// Just a simple call to AppDomain.CurrentDomain.GetAssemblies(), nothing more.
        /// </remarks>
        public Assembly[] GetAssemblies()
        {
            return AppDomain.CurrentDomain.GetAssemblies();
        }

        #endregion
    }
}

一.AppDomain解析:

   
 AppDomain在重重场地都是让翻为“应用程序域”,在本文中为拿下当下同一翻译。对于.NET的开发者,对于CLR应该是绝熟悉不过了,CLR类似于java的JVM。在CLR中,AppDomain规定了代码的执行范围,提供了不当隔离的水准,提供了一个安隔离度,并且有和谐的资源。AppDomain的切实可行成效,有如下图:

  

四.总结:

 
 本文主要教授了应用程序域的连带概念,本系列重大出口解.NET对象的超应用程序域的传递,由于规划应用程序域的始末,所以本文主要教授了有的基本概念,以及部分着力的目标,对于应用程序域包含的次序集的有关内容将于底下进行操作。在事实上的型被,很少直接沾操作应用程序域,比较多之是直接操作程序集,所以于本文的末梢被起了一个便暗淡的顺序集的操作方法。

   2.AppDomain核心对象解析:

   
 上面介绍了一些AppDomain的基本概念,接下我们来概括了解一下AppDomain的有关操作以及骨干目标。在.NET栽好经过System.AppDomain类型访问AppDomain。在这边我们实际了解一下System.AppDomain类型的措施以及总体性。对于此类的求证:https://msdn.microsoft.com/en-us/library/system.appdomain(v=vs.110).aspx。  

   (1).CurrentDomain:获取当前Thread 的当前应用程序域。

public static AppDomain CurrentDomain
    {
      get
      {
        return Thread.GetDomain();
      }
    }

   
由以上代码可知,该属性为一个静态属性,并且独自发一个仅仅读属性。该属性只是略地提存储在硬线程的TLS(线程本地存储区)中的AppDomain引用。你可当Thread.CurrentThread属性中,从硬线程的TLS中领取当前的软线程对象。 

   (2).GetData():为指定名称获取存储于现阶段应用程序域中之价值。

[SecuritySafeCritical]
    public object GetData(string name)
    {
      if (name == null)
        throw new ArgumentNullException("name");
      switch (AppDomainSetup.Locate(name))
      {
        case -1:
          if (name.Equals(AppDomainSetup.LoaderOptimizationKey))
            return (object) this.FusionStore.LoaderOptimization;
          object syncRoot = ((ICollection) this.LocalStore).SyncRoot;
          bool lockTaken = false;
          object[] objArray;
          try
          {
            Monitor.Enter(syncRoot, ref lockTaken);
            this.LocalStore.TryGetValue(name, out objArray);
          }
          finally
          {
            if (lockTaken)
              Monitor.Exit(syncRoot);
          }
          if (objArray == null)
            return (object) null;
          if (objArray[1] != null)
            ((IPermission) objArray[1]).Demand();
          return objArray[0];
        case 0:
          return (object) this.FusionStore.ApplicationBase;
        case 1:
          return (object) this.FusionStore.ConfigurationFile;
        case 2:
          return (object) this.FusionStore.DynamicBase;
        case 3:
          return (object) this.FusionStore.DeveloperPath;
        case 4:
          return (object) this.FusionStore.ApplicationName;
        case 5:
          return (object) this.FusionStore.PrivateBinPath;
        case 6:
          return (object) this.FusionStore.PrivateBinPathProbe;
        case 7:
          return (object) this.FusionStore.ShadowCopyDirectories;
        case 8:
          return (object) this.FusionStore.ShadowCopyFiles;
        case 9:
          return (object) this.FusionStore.CachePath;
        case 10:
          return (object) this.FusionStore.LicenseFile;
        case 11:
          return (object) (bool) (this.FusionStore.DisallowPublisherPolicy ? 1 : 0);
        case 12:
          return (object) (bool) (this.FusionStore.DisallowCodeDownload ? 1 : 0);
        case 13:
          return (object) (bool) (this.FusionStore.DisallowBindingRedirects ? 1 : 0);
        case 14:
          return (object) (bool) (this.FusionStore.DisallowApplicationBaseProbing ? 1 : 0);
        case 15:
          return (object) this.FusionStore.GetConfigurationBytes();
        default:
          return (object) null;
      }
    }

 
 每一个AppDomain有好之条件属性集,可以透过SetData和GetData方法访问,在此被闹了GetData()方法的源码。该方式接收一个string参数,预定义应用程序域属性的称号,或曾经定义的应用程序域属性的称。返回一个特性之值,或
null(如果属性不存在)。AppDomainSetup类为一个封闭类,表示足添加到System.AppDomain的实例的程序集绑定信息。

 
 (3).CreateDomain:使用指定的称呼、证据及应用程序域设置信息创建新的应用程序域。

[SecuritySafeCritical]
    [SecurityPermission(SecurityAction.Demand, ControlAppDomain = true)]
    public static AppDomain CreateDomain(string friendlyName, Evidence securityInfo, AppDomainSetup info)
    {
      return AppDomain.InternalCreateDomain(friendlyName, securityInfo, info);
    }

 
 该法是几乎单重载,接收三只参数,域的团结名称。friendlyName:此友好名称可当用户界面中展示为标识域;securityInfo:确定代码标识的凭据,该代码在应用程序域中运作。传递
null
以动时应用程序域的信。info:包含应用程序域初始化信息之对象。该方式返回一个初创造的应用程序域。

 
 (4).ExecuteAssembly():使用指定的凭与实参执行指定文件被蕴藏的次集。

 [Obsolete("Methods which use evidence to sandbox are obsolete and will be removed in a future release of the .NET Framework. Please use an overload of ExecuteAssembly which does not take an Evidence parameter. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.")]
    public int ExecuteAssembly(string assemblyFile, Evidence assemblySecurity, string[] args)
    {
      if (assemblySecurity != null && !this.IsLegacyCasPolicyEnabled)
        throw new NotSupportedException(Environment.GetResourceString("NotSupported_RequiresCasPolicyImplicit"));
      RuntimeAssembly assembly = (RuntimeAssembly) Assembly.LoadFrom(assemblyFile, assemblySecurity);
      if (args == null)
        args = new string[0];
      return this.nExecuteAssembly(assembly, args);
    }

 
 当创建一个AppDomain后,可以应用同一多级技术强制其加载与履代码,可以行使ExecuteAssembly方法。该办法以对象AppDomain加载到程序集中,并且实施该主入口点。在父AppDomain种,ExecuteAssembly方法不见面加载或者初始化指定的次序集。ExecuteAssembly是一个一同的例程,这即表示调用者将给死,直到程序的Main方法把控制权交还运行时。

 
 ExecuteAssembly方法有几乎个重载版本,在这边就将出一个版本来说明。该方法接收三独参数,assemblyFile:包含要实施顺序集的文本之称谓;assemblySecurity:为顺序集提供的凭据;args:程序集的入口点的实参。该法返回 程序集的入口点返回的价。该办法应用Assembly.LoadFrom来加载程序集。有关程序集的情节将当生同样篇讲解。

 
 (5).DoCallBack():在外一个应用程序域中推行代码,该应用程序域由指定的嘱托标识。

 public void DoCallBack(CrossAppDomainDelegate callBackDelegate)
    {
      if (callBackDelegate == null)
        throw new ArgumentNullException("callBackDelegate");
      callBackDelegate();
    }

 
 这个指定方法必须是静态的,并且其的签名以及CrossAppDomainDelegate签名匹配。

 
 本文主要教学对象在应用程序域中之传递。主要讲解应用程序域的一对骨干目标,对于应用程序域的操作出现的比少,所以于此地让有的是次集的片段基本操作。如有不足之处,还向多多指正。

 
 本文主要讲解对象在应用程序域中之传递。主要教授应用程序域的组成部分主干目标,对于应用程序域的操作出现的可比少,所以当此地为有之凡次集的一些基本操作。如发不足之处,还向多多指正。

   2.AppDomain核心对象解析:

   
 上面介绍了片AppDomain的基本概念,接下去我们来大概询问一下AppDomain的相干操作及骨干目标。在.NET种可以透过System.AppDomain类型访问AppDomain。在这边我们实际了解一下System.AppDomain类型的艺术及性。对于此类的辨证:https://msdn.microsoft.com/en-us/library/system.appdomain(v=vs.110).aspx。  

   (1).CurrentDomain:获取当前Thread 的目前应用程序域。

public static AppDomain CurrentDomain
    {
      get
      {
        return Thread.GetDomain();
      }
    }

   
由以上代码可知,该属性为一个静态属性,并且只是发生一个仅仅读属性。该属性只是简单地领到存储在硬线程的TLS(线程本地存储区)中之AppDomain引用。你可以于Thread.CurrentThread属性中,从硬线程的TLS中提当前之软线程对象。 

   (2).GetData():为指定名称获取存储于时下应用程序域中之价。

[SecuritySafeCritical]
    public object GetData(string name)
    {
      if (name == null)
        throw new ArgumentNullException("name");
      switch (AppDomainSetup.Locate(name))
      {
        case -1:
          if (name.Equals(AppDomainSetup.LoaderOptimizationKey))
            return (object) this.FusionStore.LoaderOptimization;
          object syncRoot = ((ICollection) this.LocalStore).SyncRoot;
          bool lockTaken = false;
          object[] objArray;
          try
          {
            Monitor.Enter(syncRoot, ref lockTaken);
            this.LocalStore.TryGetValue(name, out objArray);
          }
          finally
          {
            if (lockTaken)
              Monitor.Exit(syncRoot);
          }
          if (objArray == null)
            return (object) null;
          if (objArray[1] != null)
            ((IPermission) objArray[1]).Demand();
          return objArray[0];
        case 0:
          return (object) this.FusionStore.ApplicationBase;
        case 1:
          return (object) this.FusionStore.ConfigurationFile;
        case 2:
          return (object) this.FusionStore.DynamicBase;
        case 3:
          return (object) this.FusionStore.DeveloperPath;
        case 4:
          return (object) this.FusionStore.ApplicationName;
        case 5:
          return (object) this.FusionStore.PrivateBinPath;
        case 6:
          return (object) this.FusionStore.PrivateBinPathProbe;
        case 7:
          return (object) this.FusionStore.ShadowCopyDirectories;
        case 8:
          return (object) this.FusionStore.ShadowCopyFiles;
        case 9:
          return (object) this.FusionStore.CachePath;
        case 10:
          return (object) this.FusionStore.LicenseFile;
        case 11:
          return (object) (bool) (this.FusionStore.DisallowPublisherPolicy ? 1 : 0);
        case 12:
          return (object) (bool) (this.FusionStore.DisallowCodeDownload ? 1 : 0);
        case 13:
          return (object) (bool) (this.FusionStore.DisallowBindingRedirects ? 1 : 0);
        case 14:
          return (object) (bool) (this.FusionStore.DisallowApplicationBaseProbing ? 1 : 0);
        case 15:
          return (object) this.FusionStore.GetConfigurationBytes();
        default:
          return (object) null;
      }
    }

 
 每一个AppDomain有投机的条件属性集,可以透过SetData和GetData方法访问,在此间为有了GetData()方法的源码。该方法接收一个string参数,预定义应用程序域属性的名目,或就定义之应用程序域属性的称号。返回一个特性的值,或
null(如果属性不存在)。AppDomainSetup类为一个封闭类,表示足增长到System.AppDomain的实例的程序集绑定信息。

 
 (3).CreateDomain:使用指定的名目、证据及应用程序域设置信息创建新的应用程序域。

[SecuritySafeCritical]
    [SecurityPermission(SecurityAction.Demand, ControlAppDomain = true)]
    public static AppDomain CreateDomain(string friendlyName, Evidence securityInfo, AppDomainSetup info)
    {
      return AppDomain.InternalCreateDomain(friendlyName, securityInfo, info);
    }

 
 该法存在几乎单重载,接收三独参数,域的友爱名称。friendlyName:此友好名称可当用户界面中显示为标识域;securityInfo:确定代码标识的凭证,该代码在应用程序域中运作。传递
null
以利用时应用程序域的凭据。info:包含应用程序域初始化信息之靶子。该措施返回一个初创造的应用程序域。

 
 (4).ExecuteAssembly():使用指定的信及实参执行指定文件被涵盖的次第集。

 [Obsolete("Methods which use evidence to sandbox are obsolete and will be removed in a future release of the .NET Framework. Please use an overload of ExecuteAssembly which does not take an Evidence parameter. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.")]
    public int ExecuteAssembly(string assemblyFile, Evidence assemblySecurity, string[] args)
    {
      if (assemblySecurity != null && !this.IsLegacyCasPolicyEnabled)
        throw new NotSupportedException(Environment.GetResourceString("NotSupported_RequiresCasPolicyImplicit"));
      RuntimeAssembly assembly = (RuntimeAssembly) Assembly.LoadFrom(assemblyFile, assemblySecurity);
      if (args == null)
        args = new string[0];
      return this.nExecuteAssembly(assembly, args);
    }

 
 当创建一个AppDomain后,可以使同样密密麻麻技术强制其加载与执行代码,可以利用ExecuteAssembly方法。该方法以对象AppDomain加载到程序集中,并且实施其主入口点。在父AppDomain种,ExecuteAssembly方法不会见加载或者初始化指定的先后集。ExecuteAssembly是一个协同的例程,这便象征调用者将吃堵塞,直到程序的Main方法将控制权交还运行时。

 
 ExecuteAssembly方法有几乎个重载版本,在此间才拿出一个版本来说明。该方式接收三独参数,assemblyFile:包含要实行顺序集的文本的名目;assemblySecurity:为序集提供的凭证;args:程序集的入口点的实参。该办法返回 程序集的入口点返回的价值。该方式运用Assembly.LoadFrom来加载程序集。有关程序集的内容以于产同样首讲解。

 
 (5).DoCallBack():在任何一个应用程序域中施行代码,该应用程序域由指定的托标识。

 public void DoCallBack(CrossAppDomainDelegate callBackDelegate)
    {
      if (callBackDelegate == null)
        throw new ArgumentNullException("callBackDelegate");
      callBackDelegate();
    }

 
 这个指定方法要是静态的,并且她的署名和CrossAppDomainDelegate签名匹配。