欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
淺析.Net下的AppDomain編程
我們知道,進(jìn)程是操作系統用于隔離眾多正在運行的應用程序的機制。在.Net之前,每一個(gè)應用程序被加載到單獨的進(jìn)程中,并為該進(jìn)程指定私有的虛擬內存。進(jìn)程不能直接訪(fǎng)問(wèn)物理內存,操作系統通過(guò)其它的處理把這些虛擬內存映射到物理內存或IO設備的某個(gè)區域,而這些物理內存之間不會(huì )有重疊,這就決定了一個(gè)進(jìn)程不可能訪(fǎng)問(wèn)分配給另一個(gè)進(jìn)程的內存。相應地,運行在該進(jìn)程中的應用程序也不可能寫(xiě)入另一個(gè)應用程序的內存,這確保了任何執行出錯的代碼不會(huì )損害其地址空間以外的應用程序。在這種機制下,進(jìn)程作為應用程序之間一個(gè)獨立而安全的邊界在很大程度上提高了運行安全。
進(jìn)程的缺點(diǎn)是降低了性能。許多一起工作的進(jìn)程需要相互通信,而進(jìn)程卻不能共享任何內存,你不能通過(guò)任何有意義的方式使用從一個(gè)進(jìn)程傳遞到另一個(gè)進(jìn)程的內存指針。此外,你不能在兩個(gè)進(jìn)程間進(jìn)行直接調用。你必須代之以使用代理,它提供一定程度的間接性。雖然,使用動(dòng)態(tài)連接庫dll讓所有的組件運行在同一空間,一定程度上可以提高性能,但這些組件相互影響,一個(gè)組件的錯誤將極有可能導致整個(gè)應用程序的崩潰,“dll地獄”更是讓許多應用程序難以避免。
應用程序域(AppDomain)
在.Net中,應用程序有了一個(gè)新的邊界:應用程序域(以下簡(jiǎn)稱(chēng)域)。它是一個(gè)用于隔離應用程序的虛擬邊界。為了禁止不應交互的代碼進(jìn)行交互,這種隔離是必要的。.Net的應用程序在域層次上進(jìn)行隔離,一個(gè)域中的應用程序不能直接訪(fǎng)問(wèn)另一個(gè)域中的代碼和數據。這種隔離使得在一個(gè)應用程序范圍內創(chuàng )建的所有對象都在一個(gè)域內創(chuàng )建,確保在同一進(jìn)程中一個(gè)域內運行的代碼不會(huì )影響其他域內的應用程序,大大提高了運行的安全。
.Net結構中,由于公共語(yǔ)言運行庫能夠驗證代碼是否為類(lèi)型安全的代碼,所以它可以提供與進(jìn)程邊界一樣大的隔離級別,其性能開(kāi)銷(xiāo)也要低得多。你可以在單個(gè)進(jìn)程中運行幾個(gè)域,而不會(huì )造成進(jìn)程間調用或切換等方面的額外開(kāi)銷(xiāo)。這種方法是把任何一個(gè)進(jìn)程分解到多個(gè)域中,允許多個(gè)應用程序在同一進(jìn)程中運行,每個(gè)域大致對應一個(gè)應用程序,運行的每個(gè)線(xiàn)程都在一個(gè)特殊的域中。如果不同的可執行文件都運行在同一個(gè)進(jìn)程空間中,它們就能輕松地共享數據或直接訪(fǎng)問(wèn)彼此的數據。這種代碼同運行同一個(gè)進(jìn)程但域不同的類(lèi)型安全代碼一起運行時(shí)是安全的。在一個(gè)進(jìn)程內運行多個(gè)應用程序的能力顯著(zhù)增強了服務(wù)器的可伸縮性。
域間通信
域是.Net 帶來(lái)的一個(gè)重要改進(jìn),它不僅將眾多在運行的應用程序隔離開(kāi)來(lái),還不影響彼此間通信。雖然,公共語(yǔ)言運行庫禁止在不同域中的對象之間進(jìn)行直接調用,但我們可以復制這些對象,或通過(guò)代理訪(fǎng)問(wèn)這些對象。如果以前一種方式,那么對該對象的調用為本地調用。也就是說(shuō),調用方和被引用的對象位于同一域中。如果通過(guò)代理訪(fǎng)問(wèn)對象,調用方和被引用的對象位于不同的域中,對該對象的調用被視為遠程調用,這種情形與兩個(gè)進(jìn)程間的調用或兩臺計算機間的調用結構大致相同。這時(shí),需要被引用對象的元數據對于兩個(gè)域均可用,以便.Net即時(shí)編譯JIT能正確執行。
域與線(xiàn)程的關(guān)系
在.Net中,線(xiàn)程是公共語(yǔ)言運行庫用來(lái)執行代碼的操作系統構造。在運行時(shí),所有托管代碼均加載到一個(gè)域中,由特定的操作系統線(xiàn)程來(lái)運行。然而,域和線(xiàn)程之間并不具有一一對應關(guān)系。在任意給定時(shí)間,單個(gè)域中可以執行不止一個(gè)線(xiàn)程,而且特定線(xiàn)程也并不局限在單個(gè)域內。也就是說(shuō),線(xiàn)程可以跨越域邊界,不為每個(gè)域創(chuàng )建新線(xiàn)程。當然,在指定時(shí)刻,每一線(xiàn)程都只能在一個(gè)域中執行。運行庫會(huì )跟蹤所有域中有哪些線(xiàn)程正在運行。通過(guò)調用.Net類(lèi)庫的 Thread.GetDomain 方法,你還可以確定正在執行的線(xiàn)程所在的域。
域的創(chuàng )建
作為公共語(yǔ)言運行庫的隔離單元,域在進(jìn)程中創(chuàng )建和運行。.Net結構中,運行時(shí)宿主(也叫作運行時(shí)主機)是負責將運行時(shí)載入進(jìn)程并在域中執行用戶(hù)代碼和托管代碼的應用程序。運行時(shí)宿主包括ASP.Net、瀏覽器Internet Explorer 和 Windows等外殼程序,負責創(chuàng )建進(jìn)程和默認域,例如,Asp.Net為每個(gè)運行在web服務(wù)器上的web應用程序創(chuàng )建一個(gè)域。瀏覽器Internet explore創(chuàng )建運行受管制控件的域。
對多數應用程序,你并不必須創(chuàng )建相應的域,每次CLR在初始化一個(gè)進(jìn)程時(shí),將創(chuàng )建默認域,并使該進(jìn)程運行于這個(gè)默認域下。然而,默認域不能由任何系統調用來(lái)卸載,該域只有在進(jìn)程被卸載之后才能被銷(xiāo)毀。如果直接在默認域下編程或運行代碼,而由于某種原因域的代碼崩潰了,那么就有使得整個(gè)服務(wù)隨之崩潰的風(fēng)險。
于是,針對不同的應用程序,應該創(chuàng )建和配置相應的域并載入適當的程序集。.Net為此提供了豐富的類(lèi)庫。其中,AppDomain 類(lèi)是域的編程接口,其大量的(重載)方法能完成以下任務(wù):
· 創(chuàng )建域
· 在域中加載程序集和類(lèi)型
· 枚舉域中的程序集和線(xiàn)程
· 卸載域
創(chuàng )建新域時(shí),使用AppDomain 類(lèi)的靜態(tài)方法CreateDomain。你可以為域命名并按該名稱(chēng)來(lái)引用域。下面的示例語(yǔ)句創(chuàng )建新域,并為它指定名稱(chēng) MyDomain:
AppDomain myDomain = AppDomain.CreateDomain("MyDomain");
然后你可以查詢(xún)當前域的名稱(chēng)和新創(chuàng )建子域的名稱(chēng):
string hostDomain=AppDomain.CurrentDomain.FriendlyName; string childDomain=myDomain.FriendlyName;
在這里,屬性FriendlyName表示的是域的友好名稱(chēng),友好名稱(chēng)通過(guò)從程序集的基本代碼中去除目錄路徑而形成。例如,文件名為 "d:\MyAppDomain\MyAssembly.exe" 的程序集加載到默認域中,域的友好名稱(chēng)就是 "MyAssembly.exe"。
更一般的是,在創(chuàng )建域之前,先設置好域的參數,這可以通過(guò)類(lèi)AppDomainSetup來(lái)完成。該類(lèi)的ApplicationBase 屬性定義應用程序的根目錄, AppDomainSetup 類(lèi)還有一個(gè)極重要的屬性變量LoaderOptimizzation,取值可以是MultiDomain,MultiDomainHost和SignleDomain等,用以指定被加載程序集的類(lèi)別(共享程序集或域專(zhuān)用程序集),例如,以下語(yǔ)句把程序集設置為域專(zhuān)用程序集:
appDomainSetup.LoaderOptimization=LoaderOptimizatiion.SigleDomain;
對以上兩個(gè)方面簡(jiǎn)單歸納一下,對域的典型操作就包括:設置參數然后創(chuàng )建兩個(gè)步驟,語(yǔ)句示例如下:
AppDomainSetup appDomainSetup=new AppDomainSetup();//實(shí)例化域設置appDomainSetup.LoaderOptimization=LoaderOptimization.SingleDomain; //指定域類(lèi)別AppDoman ad=AppDomain.CreateDomain(domainName,appDomainSetup); //創(chuàng )建域...//應用程序在這里運行代碼...AppDomain.Unload(ad);//卸載域
卸載域
當使用完域時(shí),可使用AppDomain類(lèi)Unload()靜態(tài)方法將其卸載。要卸載進(jìn)程中在運行的托管代碼,只能卸載代碼運行時(shí)所在的域而不能卸載單獨的程序集或類(lèi)型,Unload方法會(huì )正常關(guān)閉指定的域。這時(shí),載入域的所有程序集都會(huì )被移除,并且無(wú)法再使用。不過(guò),如果域中的程序集對域是非特定的(域無(wú)關(guān)程序集,也即共享程序集),則程序集的數據還會(huì )保留在內存中,直至整個(gè)進(jìn)程關(guān)閉。除了關(guān)閉整個(gè)進(jìn)程,沒(méi)有機制可以卸載這類(lèi)程序集。由于一個(gè)進(jìn)程中允許包含多個(gè)域,某個(gè)域可以在不停止整個(gè)進(jìn)程的情況下卸載。以這樣的方式卸載不再需要的代碼,可以減少內存占用并極大提高應用程序的可縮放性。此外,由于線(xiàn)程并不與域一一對應,當域中存在活動(dòng)線(xiàn)程時(shí),調用AppDomain.Unload方法可能無(wú)法將域卸載并導致異常。
在域中加載程序集
從上面的論述不難看出:要運行應用程序,必須首先將程序集(.Net下經(jīng)編譯產(chǎn)生,包含IL中間語(yǔ)言、元數據及清單等)加載到域中。而且一個(gè)域中可裝載多個(gè)程序集。默認情況下,公共語(yǔ)言運行庫自動(dòng)將一個(gè)程序集加載到包含引用該程序集的代碼的域。通過(guò)此方法,該程序集的代碼和數據獨立于使用該程序集的應用程序。
自行創(chuàng )建域的好處之一便是可以指定如何裝載程序集。在域中有以下兩種方式加載程序集:
1、將當前程序集加載入單獨的域中,同一個(gè)程序集可能有多個(gè)副本;
2、以非特定于域的形式加載程序集,讓一個(gè)程序集在多個(gè)域間共享;
這兩種方式各自偏重于安全性和性能,需要視具體情況在二者之間權衡。具體地,在 .Net 框架中,System.Reflection.Assembly 類(lèi)提供以下靜態(tài)方法將程序集加載至域:
· Load()在給頂程序集名稱(chēng)的前提下,加載該程序集:
Assembly SampleAssembly;…SampleAssembly = Assembly.Load("System.Data");//根據類(lèi)型加載程序集
· LoadFrom()在已知程序集文件名或路徑等信息的情況下加載程序集:
Assembly SampleAssembly;…SampleAssembly = Assembly.LoadFrom("c:\\Sample.Assembly.dll");//根據已有程序集名稱(chēng)加載
參考資料:
《Microsoft .NET Framework程序設計》《.NET Framework高級編程》《.NET框架精髓 》等
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Net托管世界的應用程序域和線(xiàn)程
重溫CLR(十六) CLR寄宿和AppDomain
進(jìn)程、應用程序域、程序集、對象上下文
關(guān)于appdomain, assembly, 進(jìn)程,線(xiàn)程的概念體會(huì )
.net開(kāi)發(fā)筆記(八) 動(dòng)態(tài)編譯
安裝和卸載 .NET Framework 受阻疑難解答
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久