閱讀目錄
一:應用程式定義域概述
二:應用程式定義域和線程的關係
三:線程跨越多個應用程式定義域執行個體
四:運行效果
一:應用程式定義域
. 在.NET中有個特點,在.NET中有個CLR,在作業系統和我們編程環境之間有個CLR,作業系統和CLR之間有種隔離,作業系統和運行庫會在應用程式間提供某種隔離,為了確保一個應用程式的代碼不會對其他不相關的應用程式產生影響,這種隔離是必須的
. .NET中新增了一個隔離層稱為應用程式定義域,它是進程內部一個邏輯獨立的部分,也就是說兩個進程之間為了讓它們不產生一些安全性的問題,一個應用程式出現錯誤,不會影響其他的應用程式,舉個例子:在Windows下經常有某個應用程式出錯了,會彈出一個框問是否要調試,在工作列下把出錯的這個應用程式關閉就行了,說明兩個進程之間它們互相是不關聯的,是因為它們之間有應用程式定義域的原因
. 公用語言運行庫可以使用應用程式定義域來提供應用程式間的隔離
. 應用程式定義域可以理解為我的地盤我做主,比如:只有一個道路的話,裡面跑著大貨車,私家車,行人,那麼大貨車出事故了是不必會影響到私家車和行人,同樣它們三個中任何一個出現問題都會影響到其它的兩個,因為它們在一個道路裡面,那麼現在假設有三個車道,快車道跑大貨車的,慢車道跑私家小型車的,行人路走人的,如果大貨車出現事故了,是不就不會不影響到私家車和行人,那麼大貨車在自己的道路裡是不想怎麼開就怎麼開,倒著開都沒事,私家車和行人同理,因為它們是在三個不同的道路裡,這裡三個車道相當於應用程式定義域,大貨車和私家車以及行人相當於三個進程
. 使用應用程式定義域
-能夠在不停止整個進程的情況下,停止某一個應用程式,一個進程中包含好多應用程式,可以把某個應用程式停止,不影響其他的應用程式
-在一個應用程式中的代碼不能訪問直接存取另外一個應用程式中的代碼或資源
-代碼的行為範圍由它所啟動並執行所在應用程式決定
-向代碼授予許可權可以由代碼運行所在的應用程式定義域來決定
二:應用程式定義域和線程的關係
. 在運行時,所有的Managed 程式碼被載入到一個應用程式定義域當中,由特定的作業系統線程來啟動並執行
. 應用程式定義域和線程之間不是一一對應的,也就是說,一個應用程式定義域可以執行多個線程,一個線程可以跨越多個應用程式定義域,但是在某個時間點上,某個線程還是在一個應用程式定義域當中的
. 通過調用Thread.GetDomain方法,可以確定線程執行所在的域
三:線程跨越多個應用程式定義域執行個體
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace AppDomainAndThread
{
class Program
{
static void Main(string[] args)
{
//建立一個應用程式定義域
AppDomain appdomain = AppDomain.CreateDomain("MyAppDomain");
appdomain.SetData("DomainKey", "DomainValue");
CommonMethod();
//CrossAppDomainDelegate它是個委託,這個委託的作用是跨應用程式定義域調用的,
CrossAppDomainDelegate mydelegate = new CrossAppDomainDelegate(CommonMethod);
//AppDomain的DoCallBack方法用於跨越應用程式調用,在另外一個應用程式定義域中執行代碼也就是我們的輸出內容
appdomain.DoCallBack(mydelegate);
Console.ReadKey();
}
/// <summary>
/// 兩個應用程式定義域都要調用的方法
/// </summary>
private static void CommonMethod()
{
//獲得當前的應用程式定義域
AppDomain appdomain = AppDomain.CurrentDomain;
Console.WriteLine("應用程式定義域它的值是:'" + appdomain.GetData("DomainKey") + "' 在'" + appdomain.FriendlyName.ToString() + "'中找到的,啟動並執行線程ID是:'" + AppDomain.GetCurrentThreadId().ToString() + "'");
}
}
}
四:運行效果
我們發現兩個應用程式定義域分別是“AppDomainAndThread.vshost.exe”和“MyAppDomain”,它們兩個的ThreadID是一樣的都是5832,在兩個應用程式定義域執行的是同一個線程