应用程序域

一.什么是应用程序域?

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

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

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

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

SetupInfo设置程序域的信息

   [Serializable]
public class SetupInfo : MarshalByRefObject
{
/// <summary>应用程序域id</summary>
public string Id { get; set; } /// <summary>应用目录</summary>
public string BinaryDirectory { get; set; } /// <summary>应用父目录</summary>
public string BaseDirectory { get; set; } /// <summary>应用入点</summary>
public string EntryPoint { get; set; }
}

ProxyObject代理对象

  [Serializable]
public class ProxyObject : MarshalByRefObject
{
public Assembly assembly; public object instance; public Type currentType; public void Initialize()
{
var setupInfo = AppDomain.CurrentDomain.GetData("SETUPINFO") as SetupInfo; string entryClass = "ZLP.AWSW.Person";
string assemblyName = "ZLP.AWSW" + ".dll";
string assemblyPath = Path.Combine(setupInfo.BinaryDirectory, assemblyName);
if (!File.Exists(assemblyPath))
{
return;
}
assembly = Assembly.LoadFrom(assemblyPath);
instance = assembly.CreateInstance(entryClass);
currentType = instance.GetType();
var methinfo = currentType.GetMethod("Execute");
methinfo.Invoke(instance, null);
}
}

Proxy代理

  [Serializable]
public class Proxy : MarshalByRefObject
{
public Proxy(SetupInfo setupInfo)
{
this.SetupInfo = setupInfo;
this.Id = setupInfo.Id;
} public string Id { get; set; } public AppDomain Domain { get; set; } public ProxyObject ProxyObject { get; set; } public SetupInfo SetupInfo { get; set; } public void Start()
{
if (Domain == null)
{
Domain = CreateDomain();
}
if (ProxyObject == null)
{
ProxyObject = CreateProxyObject();
}
} public AppDomain CreateDomain()
{
var setup = new AppDomainSetup(); var cachePath = AppDomain.CurrentDomain.SetupInformation.CachePath;
var configurationFile = Path.Combine(SetupInfo.BinaryDirectory, "app.config");
setup.ApplicationBase = SetupInfo.BaseDirectory;
setup.PrivateBinPath = SetupInfo.BinaryDirectory;
setup.ShadowCopyFiles = "true";
setup.ApplicationName = SetupInfo.Id;
setup.ShadowCopyDirectories = string.Format("{0};{1}", SetupInfo.BaseDirectory, SetupInfo.BinaryDirectory);
setup.CachePath = cachePath;
setup.LoaderOptimization = LoaderOptimization.MultiDomainHost;
if (File.Exists(configurationFile))
{
setup.ConfigurationFile = configurationFile;
}
AppDomain domain = AppDomain.CreateDomain(setup.ApplicationName, AppDomain.CurrentDomain.Evidence, setup);
domain.DoCallBack(new CrossAppDomainDelegate(delegate
{
LifetimeServices.LeaseTime = TimeSpan.Zero;
}));
domain.SetData("SETUPINFO", SetupInfo);
domain.DomainUnload += new EventHandler(DomainUnload);
domain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledException);
return domain;
} public ProxyObject CreateProxyObject()
{
Type type = typeof(ProxyObject);
Assembly currentAssembly = Assembly.GetExecutingAssembly();
ProxyObject proxyObject = Domain.CreateInstanceAndUnwrap(currentAssembly.FullName, type.FullName) as ProxyObject;
currentAssembly = null;
type = null;
return proxyObject;
} private void UnhandledException(object sender, UnhandledExceptionEventArgs e)
{ } private void DomainUnload(object sender, EventArgs e)
{ }
}

以上仅供参考....

AppDomain 应用程序域的更多相关文章

  1. C#学习笔记----AppDomain应用程序域

    使用.Net建立的可执行程序*.exe,并没有直接承载到进程当中,而是承载到应用程序域(AppDomain)当中.应用程序域是.Net引入的一个新概念,它比进程所占用的资源要少,可以被看做是一个轻量级 ...

  2. C# 通过 AppDomain 应用程序域实现程序集动态卸载或加载

    AppDomain 表示应用程序域,它是一个应用程序在其中执行的独立环境.每个应用程序只有一个主应用程序域,但是一个应用程序可以创建多个子应用程序域. 因此可以通过 AppDomain 创建新的应用程 ...

  3. .Net环境下的缓存技术介绍 (转)

    .Net环境下的缓存技术介绍 (转) 摘要:介绍缓存的基本概念和常用的缓存技术,给出了各种技术的实现机制的简单介绍和适用范围说明,以及设计缓存方案应该考虑的问题(共17页) 1         概念 ...

  4. MVC5知识点记录

    IIS/ASP.NET管道 原理永远是重中之重,所以在开篇的地方,先了解一下地址栏输入网址回车之后的故事. 不同IIS版本处理请求也不一样 IIS5 IIS 5.x 运行在进程InetInfo.exe ...

  5. .NET架构设计、框架设计系列文章总结

    从事.NET开发到现在已经有七个年头了.慢慢的可能会很少写.NET文章了.不知不觉竟然走了这么多年,热爱.NET热爱c#.突然想对这一路的经历进行一个总结. 是时候开始下一阶段的旅途,希望这些文章可以 ...

  6. [转]C#反射-Assembly.Load、LoadFrom与LoadFile进阶

    关于.NET中的反射,常用的有三个方法: Assembly.Load()Assembly.LoadFrom()Assembly.LoadFile() 下面说说这三个方法的区别和一些细节问题 1. As ...

  7. ASP.NET学习链接

    张子阳个人ASP.NET技术博客:http://www.tracefact.net/Asp-Net/ 动态加载asp.net分页控件:http://www.cnblogs.com/cresuccess ...

  8. .Net环境下的缓存技术介绍

    .Net环境下的缓存技术介绍 摘要: 介绍缓存的基本概念和常用的缓存技术,给出了各种技术的实现机制的简单介绍和适用范围说明,以及设计缓存方案应该考虑的问题(共17页) 1         概念 1.1 ...

  9. Asp.net管道模型(管线模型)

    Asp.net管道模型(管线模型)   前言 为什么我会起这样的一个标题,其实我原本只想了解asp.net的管道模型而已,但在查看资料的时候遇到不明白的地方又横向地查阅了其他相关的资料,而收获比当初预 ...

随机推荐

  1. hdu 2629 Identity Card (字符串解析模拟题)

    这题是一个字符串模拟水题,给12级学弟学妹们找找自信的,嘿嘿; 题目意思就是要你讲身份证的上的省份和生日解析出来输出就可以了: http://acm.hdu.edu.cn/showproblem.ph ...

  2. Java实现文件压缩与解压[zip格式,gzip格式]

    Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个文件和任意级联文件夹进行压缩和解压,对于一些初学者来说是个很不错的实例. zip扮演着归档和压缩两个角色:gzip并 ...

  3. 增强学习贪心算法与Softmax算法

    (一) 这个算法是基于一个概率来对探索和利用进行折中:每次尝试时,以概率进行探索,即以均匀概率随机选取一个摇臂,以的概率进行利用,即以这个概率选择当前平均奖赏最高的摇臂(如有多个,则随机选取). 其中 ...

  4. 在云服务器搭建WordPress博客(六)发布和管理文章

    <( ̄︶ ̄)↗[GO!] 发布文章是一个网站后台最重要的功能之一,WordPress的文章发布功能是比较强大的,系统简单地介绍一下. 访问后台 – 文章 – 写文章 ,就可以看到如下图所示的界面 ...

  5. HDU 5792 World is Exploding 树状数组+枚举

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5792 World is Exploding Time Limit: 2000/1000 MS (Ja ...

  6. StoreKit framework

    关于In-APP Purchase 1. 中文文档 基本流程: http://www.cnblogs.com/wudan7/p/3621763.html 三种购买形式及StoreKit code介绍: ...

  7. 6 高级IO函数

    6.1 pipe函数 pipe函数创建一个管道,用于实现进程间通信 #include<unistd.h> ]); 参数包含两个文件描述符fd[0]和fd[1],往fd[1]写入的数据可以从 ...

  8. Chapter 4 持久存储数据对象

    1.使用with open("filename.扩展名","r/w/rb/wb") as data代替data=open(..);data.close() 打开 ...

  9. POJ1811 Prime Test(miller素数判断&&pollar_rho大数分解)

    http://blog.csdn.net/shiyuankongbu/article/details/9202373 发现自己原来的那份模板是有问题的,而且竟然找不出是哪里的问题,所以就用了上面的链接 ...

  10. POJ 2549

    Sumsets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8235   Accepted: 2260 Descripti ...