zoukankan      html  css  js  c++  java
  • AppDomain 应用程序域

    应用程序域

    一.什么是应用程序域?

    应用程序域 (application domain) (AppDomain) 一种边界,它由公共语言运行库围绕同一应用程序范围内创建的对象建立(即,从应用程序入口点开始,沿着对象激活的序列的任何位置)。应用程序域有助于将在一个应用程序中创建的对象与在其他应用程序中创建的对象隔离,以使运行时行为可以预知。在一个单独的进程中可以存在多个应用程序域。
     

    二.什么时候用应用程序域?

    在一个应用程序中出现的错误不会影响其他应用程序。因为类型安全的代码不会导致内存错误,所以使用应用程序域可以确保在一个域中运行的代码不会影响进程中的其他应用程序。
    能够在不停止整个进程的情况下停止单个应用程序。使用应用程序域使您可以卸载在单个应用程序中运行的代码。
    注意 不能卸载单个程序集或类型。只能卸载整个域。

    三.应用程序域的简单实例?

    SetupInfo设置程序域的信息

     1   [Serializable]
     2     public class SetupInfo : MarshalByRefObject
     3     {
     4        /// <summary>应用程序域id</summary>
     5        public string Id { get; set; }
     6 
     7        /// <summary>应用目录</summary>
     8        public string BinaryDirectory { get; set; }
     9        
    10        /// <summary>应用父目录</summary>
    11        public string BaseDirectory { get; set; }
    12        
    13        /// <summary>应用入点</summary>
    14        public string EntryPoint { get; set; }
    15     }
    View Code

    ProxyObject代理对象

     1  [Serializable]
     2     public class ProxyObject : MarshalByRefObject
     3     {
     4         public Assembly assembly;
     5 
     6         public object instance;
     7 
     8         public Type currentType;
     9 
    10         public void Initialize()
    11         {
    12             var setupInfo = AppDomain.CurrentDomain.GetData("SETUPINFO") as SetupInfo;
    13 
    14             string entryClass = "ZLP.AWSW.Person";
    15             string assemblyName = "ZLP.AWSW" + ".dll";
    16             string assemblyPath = Path.Combine(setupInfo.BinaryDirectory, assemblyName);
    17             if (!File.Exists(assemblyPath))
    18             {
    19                 return;
    20             }
    21             assembly = Assembly.LoadFrom(assemblyPath);
    22             instance = assembly.CreateInstance(entryClass);
    23             currentType = instance.GetType();
    24             var methinfo = currentType.GetMethod("Execute");
    25             methinfo.Invoke(instance, null);
    26         }
    27     }
    View Code

     

    Proxy代理

     1  [Serializable]
     2     public class Proxy : MarshalByRefObject
     3     {
     4         public Proxy(SetupInfo setupInfo)
     5         {
     6             this.SetupInfo = setupInfo;
     7             this.Id = setupInfo.Id;
     8         }
     9 
    10         public string Id { get; set; }
    11 
    12         public AppDomain Domain { get; set; }
    13 
    14         public ProxyObject ProxyObject { get; set; }
    15 
    16         public SetupInfo SetupInfo { get; set; }
    17 
    18         public void Start()
    19         {
    20             if (Domain == null)
    21             {
    22                 Domain = CreateDomain();
    23             }
    24             if (ProxyObject == null)
    25             {
    26                 ProxyObject = CreateProxyObject();
    27             }
    28         }
    29 
    30         public AppDomain CreateDomain()
    31         {
    32             var setup = new AppDomainSetup();
    33 
    34             var cachePath = AppDomain.CurrentDomain.SetupInformation.CachePath;
    35             var configurationFile = Path.Combine(SetupInfo.BinaryDirectory, "app.config");
    36             setup.ApplicationBase = SetupInfo.BaseDirectory;
    37             setup.PrivateBinPath = SetupInfo.BinaryDirectory;
    38             setup.ShadowCopyFiles = "true";
    39             setup.ApplicationName = SetupInfo.Id;
    40             setup.ShadowCopyDirectories = string.Format("{0};{1}", SetupInfo.BaseDirectory, SetupInfo.BinaryDirectory);
    41             setup.CachePath = cachePath;
    42             setup.LoaderOptimization = LoaderOptimization.MultiDomainHost;
    43             if (File.Exists(configurationFile))
    44             {
    45                 setup.ConfigurationFile = configurationFile;
    46             }
    47             AppDomain domain = AppDomain.CreateDomain(setup.ApplicationName, AppDomain.CurrentDomain.Evidence, setup);
    48             domain.DoCallBack(new CrossAppDomainDelegate(delegate
    49             {
    50                 LifetimeServices.LeaseTime = TimeSpan.Zero;
    51             }));
    52             domain.SetData("SETUPINFO", SetupInfo);
    53             domain.DomainUnload += new EventHandler(DomainUnload);
    54             domain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledException);
    55             return domain;
    56         }
    57 
    58         public ProxyObject CreateProxyObject()
    59         {
    60             Type type = typeof(ProxyObject);
    61             Assembly currentAssembly = Assembly.GetExecutingAssembly();
    62             ProxyObject proxyObject = Domain.CreateInstanceAndUnwrap(currentAssembly.FullName, type.FullName) as ProxyObject;
    63             currentAssembly = null;
    64             type = null;
    65             return proxyObject;
    66         }
    67 
    68         private void UnhandledException(object sender, UnhandledExceptionEventArgs e)
    69         {
    70 
    71         }
    72 
    73         private void DomainUnload(object sender, EventArgs e)
    74         {
    75 
    76         }
    77     }
    View Code

    以上仅供参考....

  • 相关阅读:
    Java利用QRCode.jar包实现二维码编码与解码
    javax.servlet不存在问题的解决
    订单号生成规则
    Koa处理url
    网站追踪技术:前端持久化evercookie
    网站追踪技术:“帆布指纹识别”canvas fingerprinting
    Typescript类、命名空间、模块
    TypeScript 基础类型、变量声明、函数、联合类型、接口
    webpack中的hash、chunkhash、contenthash区别
    不刷新网页修改url链接:history.pushState()和history.replaceState()新增、修改历史记录用法介绍
  • 原文地址:https://www.cnblogs.com/zlp520/p/4078970.html
Copyright © 2011-2022 走看看