一应用程序域
在NET中有个特点在NET中有个CLR在操作系统和我们编程环境之间有个CLR操作系统和CLR之间有种隔离操作系统和运行库会在应用程序间提供某种隔离为了确保一个应用程序的代码不会对其他不相关的应用程序产生影响这种隔离是必须的
NET中新增了一个隔离层称为应用程序域它是进程内部一个逻辑独立的部分也就是说两个进程之间为了让它们不产生一些安全性的问题一个应用程序出现错误不会影响其他的应用程序举个例子在Windows下经常有某个应用程序出错了会弹出一个框问是否要调试在任务栏下把出错的这个应用程序关闭就行了说明两个进程之间它们互相是不关联的是因为它们之间有应用程序域的原因
公共语言运行库可以使用应用程序域来提供应用程序间的隔离
应用程序域可以理解为我的地盘我做主比如只有一个道路的话里面跑着大货车私家车行人那么大货车出事故了是不必会影响到私家车和行人同样它们三个中任何一个出现问题都会影响到其它的两个因为它们在一个道路里面那么现在假设有三个车道快车道跑大货车的慢车道跑私家小型车的人行道走人的如果大货车出现事故了是不就不会不影响到私家车和行人那么大货车在自己的道路里是不想怎么开就怎么开倒着开都没事私家车和行人同理因为它们是在三个不同的道路里这里三个车道相当于应用程序域大货车和私家车以及行人相当于三个进程
使用应用程序域
能够在不停止整个进程的情况下停止某一个应用程序一个进程中包含好多应用程序可以把某个应用程序停止不影响其他的应用程序
在一个应用程序中的代码不能访问直接访问另外一个应用程序中的代码或资源
代码的行为范围由它所运行的所在应用程序决定
向代码授予权限可以由代码运行所在的应用程序域来决定
二应用程序域和线程的关系
在运行时所有的托管代码被加载到一个应用程序域当中由特定的操作系统线程来运行的
应用程序域和线程之间不是一一对应的也就是说一个应用程序域可以执行多个线程一个线程可以跨越多个应用程序域但是在某个时间点上某个线程还是在一个应用程序域当中的
通过调用ThreadGetDomain方法可以确定线程执行所在的域
三线程跨越多个应用程序域实例
using System;
using SystemCollectionsGeneric;
using SystemLinq;
using SystemText;
using SystemThreading;
namespace AppDomainAndThread
{
class Program
{
static void Main(string[] args)
{
//创建一个应用程序域
AppDomain appdomain = AppDomainCreateDomain(MyAppDomain)
appdomainSetData(DomainKey DomainValue)
CommonMethod()
//CrossAppDomainDelegate它是个委托这个委托的作用是跨应用程序域调用的
CrossAppDomainDelegate mydelegate = new CrossAppDomainDelegate(CommonMethod)
//AppDomain的DoCallBack方法用于跨越应用程序调用在另外一个应用程序域中执行代码也就是我们的输出内容
appdomainDoCallBack(mydelegate)
ConsoleReadKey()
}
/// <summary>
/// 两个应用程序域都要调用的方法
/// </summary>
private static void CommonMethod()
{
//获得当前的应用程序域
AppDomain appdomain = AppDomainCurrentDomain;
ConsoleWriteLine(应用程序域它的值是 + appdomainGetData(DomainKey) + 在 + appdomainFriendlyNameToString() + 中找到的运行的线程ID是 + AppDomainGetCurrentThreadId()ToString() + )
}
}
}
四运行效果
我们发现两个应用程序域分别是AppDomainAndThreadvshostexe和MyAppDomain它们两个的ThreadID是一样的都是在两个应用程序域执行的是同一个线程