CLR寄宿和APPDomain

我的妈呀,终于看到这了!!!!!

寄宿

寄宿(hosting)使任何程序都能利用CLR的功能。特别要指出的是,它使现有的应用程序至少能部分使用托管代码编写(这句话暂时不太理解)。所以可以总结出一点:寄宿可以让代码具有可拓展性,但是一旦将第三方DLL加载到进程中一定以为着有一定的风险,毕竟DLL代码很容易破坏应用程序的数据结构和代码(DLL总会想尽一切办法去访问它没有权利访问的资源)

AppDomain

上述DLL又是破坏又是无权访问的,该如何解决呢?现在CLR的AppDomain功能就解决了上述这些问题。它允许现有的第三方和不受信用的代码在现有的进程中运行,由于AppDomain是属于CLR的,CLR的强大又保证了数据结构,代码不被滥用或者破坏

寄宿细节

GerRuntime函数返回指向非托管ICLRUuntiomeInfo接口的指针。有了这个指针后,就可以利用GetInterface方法获得ICLRRuntimeHost接口。这个接口的方法有如下几种:

  1. 设置宿主管理器:告诉CLR要执行的那些高级操作(内存分配,线程同步,垃圾回收…)
  2. 获取CLR管理器。CLR可以得知应该组织使用哪些类和成员。可以分辨哪些代码可以调试哪些不能…
  3. 初始化并启动CLR
  4. 加载程序集并执行其中的代码
  5. 停止CLR,组织任何更多的代码在Windows上执行

AppDomain

CLR COM服务器初始化的时候会创建一个APPDomain。APPDomain本质上是一个逻辑容器,它只有在windows进程终止的时候才会被销毁。它具体的功能有如下:

  1. 一个APPDomain不能直接访问另一个APPDomain的对象,这种隔离的方法美酒避免来当APPDomain从进程中卸载的时候,影响其他的APPDomain正在运行的代码
  2. APPDomain可以单独卸载(从而卸载APPDomain当前包含的所有程序集)
  3. APPDomain可以单独保护(它会向自己应用的程序集给予一个最大权限,这个权限就保证来不会破坏或读取本身使用的一些重要数据)

卸载AppDomain

APPDomain很强大的一个地方就是可以卸载。主要操作步骤:

  1. CLR挂起进程中执行过托管代码的所有线程
  2. CLR检查所有线程栈,查看哪些进程正在被准备删除的AppDomain执行
  3. 当上一步执行完毕之后,CLR遍历堆。然后哪些由AppDomain创建的对象都会设置一个flag,所有在代码上再是哟该对象的时候都会报出AppDomainUnloadedException异常
  4. CLR强制垃圾回收
  5. 调用AppDomain。Unload方法的线程将继续执行

Microsoft Silverlight 富Internet应用程序

Microsoft Silverlight是有别于.NET Framework普通桌面版本的特殊CLR,安装好Silverlight 运行时之后,每次访问了含有Microsoft Silverlight技术的网站,都会造成Microsoft Silverlight CLR(CoreClr.dll)加载到浏览器中。当然,每一个Microsoft Silverlight都在自己的AppDomain中运行。一旦用户关闭或者换到其他的页面网站,AppDomain会被卸载。

Microsoft ASP.NET和XMl Web 服务应用程序

ASP.NET作为一个ISAPI DLL实现。首先这个DLL会处理URL,然后客户端接受到这个URL的时候,ASP.NET会加载CLR。当客户端请求一个Web应用程序的时候,ASP.NET会判断这是不是第一次请求,如果是,ASP.NET会要求CLR为该Web应用程序创建一个新的AppDomain。反之如果客户端请求的是已经运行过的Web应用程序,ASP.NET就不会再新建AppDomainl ,而且可想而知,客户端后续的请求将会性能出众,反应快。

ASP.NET的亮点在于可以在不关闭Web程序的时候动态的更改代码:(一旦网站的文件在硬件上发生改动的时候,ASP.NET会检测到这个情况,并卸载包含旧版本文件的AppDomain,然后迅速创建一个新的AppDomain。)在这里ASP.NET使用了一个AppDomain的一个名为“复制影像”(shadow coping)的功能。

生产型应用程序

取名为宏,宏可以访问与CLR一起运行的所有程序集和类型。(生产型应用程序也允许用户用任何编程语言来编写宏)要知道的是,宏会被编译(能被编译的,后期的执行速度都很快)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值