C#基础-应用程序域

文章导读

同一台计算上的应用程序是通过进程来隔离的,每个应用程序都是加载到不同的进程中,从而达到应用程序的互不影响。操作系统【OS】通过进程控制块【PCB】感知进程的存在,分析【PCB】的数据结构可以发现,【PCB】维护进程运行的内存空间,就是我们所说的虚拟内存,然后OS负责映射到实际的内存空间。应用程序互不影响简单解释就是说A应用程序不能随意的操作B应用程序的内存空间,内存空间又与进程相互对应。因此可以理解进程就是应用程序运行的边界。创建一个应用程序就要相应的创建一个进程,而创建进程需要耗费大量的资源并且进程与进程之间相互通信也比较困难,例如命名管道。

本文主角应用程序域【AppDomain】是.Net应用程序运行的边界,多个应用程序域能够创建在同一个进程里。这是为什么呢?所有的.Net应用程序都是运行在公共语言运行时【CLR】上,在公共语言运行时上运行的代码称作托管代码。托管代码有一项很重要的机制就是类型安全检测,安全检测包括这些代码是否会尝试访问无效的内存地址?是否会尝试执行某些导致进程(该代码运行时所在的进程)无法正常进行的其他操作?,只有通过检测的代码才能称之为类型安全,换句话说,.Net应用程序不要OS来管理应用程序运行的安全性,.Net应用程序通过CLR就能保证其运行安全。CLR就是通过应用程序域来隔离应用程序,创建应用程序域的资源耗费少,应用程序域之间通信也比较容易,通过代理来实现之间的通讯。

本文主要从三个方面简单的介绍应用程序域:

1.DotNet应用程序如何加载运行

1.创建,卸载应用程序域

2.应用程序域之间的通信

一、DotNet应用程序如何加载运行

转眼毕业已经一年时间了,每天在与.Net Framework打交道,却从没有花时间去研究.Net Framework是怎么运行起来的。

.NET Framework 应用程序无论是像托管 .exe 程序集那样自动调用的,还是使用非托管宿主 API 加载的,都需要一段称为运行时宿主的代码。运行时宿主会将运行库加载到进程中,在进程中创建应用程序域,然后在这些应用程序域内加载和执行用户代码,常见的运行时宿主包括ASP.NET【启动bs应用程序】,外壳程序可执行文件【启动cs应用程序】,.Net Framework提供了创建管理宿主的com接口,可以自定义化自己的宿主对象。

将这个过程写的详细点:

1.执行任何托管代码之前,宿主必须首先加载并初始化公共语言运行库。由于此时运行库尚未在进程中运行,.NET Framework 提供了一组被称为宿主 API 的非托管 API,宿主可以利用它们来启动运行库。加载运行时的时候可以配置并行垃圾回收机制,是否加载程序优化,版本等信息。

2.加载并初始化公共语言运行库后,宿主必须执行从非托管代码到托管代码的转换,以执行托管宿主代码和用户代码。在 .NET Framework 的早期版本中,托管宿主代码通常在默认应用程序域中运行,但是 .NET Framework 2.0 版本提供了一个基类(即 AppDomainManager),用于实现自动加载到在进程中创建的每个应用程序域中的托管宿主代码。

3.当宿主代码完成从非托管代码到托管代码的转换后,它必须新建一个或多个用于运行用户代码的应用程序域。

4.应用程序域加载和执行用户代码,可用来加载和运行托管代码的方法都基于程序集。例如,System.AppDomain 和 System.Reflection.Assembly 类包含使宿主能够加载程序集的方法。Load 方法具有各种形式:有些方法采用程序集名称,有些方法采用程序集清单所在文件的完整文件系统路径。这些方法用于加载先前已创建并保存到磁盘上的程序集。

一、创建,卸载应用程序域

公共语言运行库已经过专门设计,支持各种类型的应用程序,包括从 Web 服务器应用程序到具有传统的丰富 Windows 用户界面的应用程序在内的所有应用程序。每种应用程序都需要一个运行库宿主来启动它。运行库宿主将该运行库加载到进程中,在该进程内创建应用程序域,并且将用户代码加载到该应用程序域中。因此加载运行时部分不需要用户关系,只有有特殊需求是才会去自定义运行时的加载。用户关系的核心问题就是如何创建应用程序域来加载用户自定义的业务逻辑代码。

创建和卸载应用程序域很简单

//获取当前线程正在其中运行的应用程序域名
string callingDomainName = Thread.GetDomain().FriendlyName;
Console.WriteLine(callingDomainName);

//获取当前应用程序运行的一个程序集(AppDomain.ExcuteAssembley(string path))
string exeAssembly = Assembly.GetEntryAssembly().FullName;
Console.WriteLine(exeAssembly);

//通过AppDomain类的CreateDomain静态方法创建一个域,
//CreateDomain有很多重载的方法,总有一个适合您
AppDomain adSecond = AppDomain.CreateDomain("Ad #2");

//卸载域
AppDomain.Unload(adSecond);
二、应用程序域之间的通信

代码背景假如用户第一次请求站点的时候,AspNet宿主会创建一个新的应用程序域来处理这个web应用的所有请求,只是举例,实际处理过程复杂的多。

class Program
{
static void Main(string[] args)
{
//获取当前线程正在其中运行的应用程序域名
string callingDomainName = Thread.GetDomain().FriendlyName;
Console.WriteLine(callingDomainName);

//获取当前应用程序运行的一个程序集(AppDomain.ExcuteAssembley(string path))
string exeAssembly = Assembly.GetEntryAssembly().FullName;
Console.WriteLine(exeAssembly);

// 配置应用程序域信息
AppDomainSetup ads = new AppDomainSetup();
ads.ApplicationName = "webSite #1";

// 创建应用程序域(模拟第一次web请求IIS)
AppDomain webSite = AppDomain.CreateDomain("webSite #1", null, ads);

string context = "http://www.cnblogs.com/prince_hui/";
//在创建域中创建一个运行时对象
HttpRuntime runtime =
(HttpRuntime)webSite.CreateInstanceAndUnwrap(
exeAssembly,
typeof(HttpRuntime).FullName
);

//runtime是新应用程序域中对象的代理,通过调用代理处理请求
runtime.ProcessRequest(context);

//卸载掉应用程序域,此时域中的对象也被回收
AppDomain.Unload(webSite);
try
{
runtime.ProcessRequest(context);
Console.WriteLine("Sucessful ProcessRequest.");
}
catch (AppDomainUnloadedException)
{
Console.WriteLine("Failed ProcessRequest; this is expected.");
}

Console.Read();
}
}

// 因为HttpRuntime继承自MarshalByRefObject,
// 所以HttpRuntime的代理对象能够在多个域中传递
public class HttpRuntime : MarshalByRefObject
{
//通过代理调用这个方法
public void ProcessRequest(string context)
{
// 获取应用程序域的配置信息
AppDomainSetup ads = AppDomain.CurrentDomain.SetupInformation;
Console.WriteLine("WebSiteName: {0}",
ads.ApplicationName
);

//处理请求啦
Console.WriteLine("ProcessRequest '{0}' in new domain:'{1}'.",
context,
Thread.GetDomain().FriendlyName
);
}
}

运行结果如下:

AppDomainDemo

作者:刘慧

出处:http://www.cnblogs.com/prince_hui/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/philwiki/p/3147527.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java生鲜电商平台-微服务入门与服务的拆分架构实战

Java生鲜电商平台-微服务入门与服务的拆分架构实战 刚开始进入软件行业时还是单体应用的时代,前后端分离的概念都还没普及,开发的时候需要花大量的时间在“强大”的JSP上面,那时候SOA已经算是新技术了。现在,微服务已经大行其道&a…

详解MTK系统中字符转换问题

详解MTK系统中字符转换问题 2011-09-05 19:02 佚名 互联网 字号:T | TMTK系统中字符转换问题是本文要介绍的内容,主要是来了解并学习MTK中一些小案例的应用,具体内容来看本文详解。 AD:2014WOT全球软件技术峰会北京站 课程视频发布…

Java生鲜电商平台-微服务架构概述

Java生鲜电商平台-微服务架构概述 单体架构存在的问题 在传统的软件技术架构系统中,基本上将业务功能集中在单一应用内,或者是单一进程中。尽管现代化的软件架构理论以及设计原则已推广多年,但实际技术衍化的速度迟缓并且变革动力不足。 其中…

Jensen不等式及其证明

• 詹森不等式以丹麦数学家约翰詹森(JohanJensen)命名。它给出积分的凸函数值和凸函数的积分值间的关系。 关于凸函数: if (-f)是凸函数(convex),则f是凹的(concave…

五款帮助创业者迅速熟悉互联网创业的在线学习工具

相信很多有志青年都想借助互联网开拓自己的事业,可是经常面临一个很现实的问题——缺乏一定的专业知识和技能。没关系,互联网中的丰富教育资源就可以让你迅速地跨越这一障碍,熟悉与创业相关的运营、管理、融资等操作技巧。下面介绍的五个在线…

caffe 下测试 MNIST数据

详细说明可参考网页:http://blog.csdn.net/wangchuansnnu/article/details/44341753http://blog.sina.com.cn/s/blog_49ea41a20102w4uu.htmlhttp://www.cnblogs.com/yymn/p/4553671.html caffe 下 mnist 进行实验: MNIST,一个经典的手写数字库…

Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战

Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战 Java生鲜电商平台- 什么是秒杀 通俗一点讲就是网络商家为促销等目的组织的网上限时抢购活动 比如说京东秒杀,就是一种定时定量秒杀,在规定的时间内,无论商品是否秒杀完毕&#xff0c…

caffe 提取特征并可视化(已测试可执行)及在线可视化

网络结构在线可视化工具 http://ethereon.github.io/netscope/#/editor 参考主页: caffe 可视化的资料可在百度云盘下载 链接: http://pan.baidu.com/s/1jIRJ6mU 提取密码:xehi http://cs.stanford.edu/people/karpathy/cnnembed/ http://lijianch…

Caffe + Ubuntu 15.04/16.04 + CUDA 7.5/8.0 在服务器上安装配置及卸载重新安装(已测试可执行)

本文参考如下: caffe 安装所需的所有资源可在百度网盘下载 链接: http://pan.baidu.com/s/1jIRJ6mU 提取密码:xehi 在服务器上为每个子用户拷贝caffe 使用 Linux探索之旅 | 第一部分第四课:磁盘分区完成Ubuntu安装 Ubuntu16.04 1080Ti深度学习环境配…

ASP.NET MVC Action向视图传值之匿名类型

在使用ASP.NET MVC过程中想必大家都有遇到过一个问题就是我们的Action如何向视图传递匿名类型的值呢,如果不做特殊处理则无法实现。 接下来我们来看一个示例: 在我们的控制中: using System.Collections.Generic; using System.Web.Mvc;names…

2015伦敦深度学习峰会笔记(转载)

摘要:在伦敦举行的第三届深度学习峰会由RE.WORK主办,汇集了从工业领域到学术领域不同背景的专业人士,本文是该峰会第一天的笔记。包括Koray Kavukcuoglu、Sander Dieleman等知名深度学习专家分享了自己的经验。上周,我有机会参加在…

Awesome Deep Vision

本文转自:https://github.com/kjw0612/awesome-deep-vision http://jiwonkim.org/awesome-deep-vision/ A curated list of deep learning resources for computer vision, inspired by awesome-php and awesome-computer-vision. Maintainers - Jiwon Kim, Heesoo …

caffe框架翻译-理解(转载)

本文转自: http://dirlt.com/caffe.html http://blog.csdn.net/songyu0120/article/details/468170851 caffe http://caffe.berkeleyvision.org/ 1.1 setup 安装需要下面这些组件。这些组件都可以通过apt-get获得。 libgoogle-glog-dev # gloglibgflags-dev # gfla…

Java生鲜电商平台-SpringCloud微服务架构中分布式事务解决方案

Java生鲜电商平台-SpringCloud微服务架构中分布式事务解决方案 说明:Java生鲜电商平台中由于采用了微服务架构进行业务的处理,买家,卖家,配送,销售,供应商等进行服务化,但是不可避免存在分布式事…

【Yoshua Bengio 亲自解答】机器学习 81 个问题及答案(最全收录)

本文转自:http://mp.weixin.qq.com/s?__bizMzI3MTA0MTk1MA&mid401958262&idx1&sn707f228cf5779a31f0933af903516ba6&scene1&srcid0121zzdeFPtgoRoEviZ3LZDG#rd 译者:张巨岩 王婉婷 李宏菲 戴秋池 这是 Quora 的最新节目&#xf…

基础js逆向练习-登录密码破解(js逆向)

练习平台:逆向账号密码 https://login1.scrape.center/ 直接打开平台,输入密码账号,抓包找到加密的参数携带的位置,这边我们找到的是一个叫token的加密参数,这个参数的携带是一个密文 我们首先考虑一下搜索这个加密的…

python之socket

socket套接字 什么叫socket socket是处于应用层与传输层之间的抽象层,他是一组操作起来非常简单的接口(接受数据)此接口接受数据之后,交由操作系统.socket在python中就是一个模块. socket两个分类 基于文件类型的套接字家族 套接字家族的名字:AF_UNIX unix一切皆文件…

socket补充:通信循环、链接循环、远程操作及黏包现象

socket补充:通信循环、链接循环、远程操作及黏包现象 socket通信循环 server端: import socketphone socket.socket(socket.AF_INET,socket.SOCK_STREAM)phone.bind((127.0.0.1,8080))phone.listen(5)conn, client_addr phone.accept() print(conn, cl…

Java生鲜电商平台-SpringCloud微服务架构中核心要点和实现原理

Java生鲜电商平台-SpringCloud微服务架构中核心要点和实现原理 说明:Java生鲜电商平台中,我们将进一步理解微服务架构的核心要点和实现原理,为读者的实践提供微服务的设计模式,以期让微服务在读者正在工作的项目中起到积极的作用。…

ASP.NET Core Web 应用程序开发期间部署到IIS自定义主机域名并附加到进程调试

想必大家之前在进行ASP.NET Web 应用程序开发期间都有用到过将我们的网站部署到IIS自定义主机域名并附加到进程进行调试。 那我们的ASP.NET Core Web 应用程序又是如何部署到我们的IIS上面进行调试的呢,接下来我们来简单介绍下: 一、安装IIS所需的Host扩…