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.pswp.cn/news/247175.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247175.shtml
英文地址,請注明出處:http://en.pswp.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…

ios自帶NSURLConnection下載文件

//同步下載,同步請求的主要代碼如下 - (IBAction)downLoad:(id)sender { NSString *urlAsString"http://7jpnsh.com1.z0.glb.clouddn.com/TravelDemo.plist";//文件地址 NSURL *url[NSURL URLWithString:urlAsString]; NSURLRequest *request[NSURLRequest requestWi…

國外程序員整理的機器學習資源大全

本列表選編了一些機器學習領域牛B的框架、庫以及軟件(按編程語言排序)。 C 計算機視覺 CCV —基于C語言/提供緩存/核心的機器視覺庫,新穎的機器視覺庫 OpenCV—它提供C, C, Python, Java 以及 MATLAB接口,并支持Windo…

五款幫助創業者迅速熟悉互聯網創業的在線學習工具

相信很多有志青年都想借助互聯網開拓自己的事業,可是經常面臨一個很現實的問題——缺乏一定的專業知識和技能。沒關系,互聯網中的豐富教育資源就可以讓你迅速地跨越這一障礙,熟悉與創業相關的運營、管理、融資等操作技巧。下面介紹的五個在線…

C++ 中復雜的聲明

1、方法也是有類型的,方法的類型由返回類型和形參表決定。比如int F (int)的類型就是去掉方法名,int (int)。 2、對于方法類型,在返回類型和形參表之間,加上一個名稱F,就表示一個特定的方法F。 3、思考,如果…

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…

LInux 下安裝 python notebook 及指向路徑,運行計時,炫酷的深藍午夜主題,本地登陸遠程服務器

1. 安裝 pip工具 sudo apt-get install pyton-pip 2. 安裝ipython及其依賴包 sudo apt-get install ipython ipython-notebook 3. 安裝可選的附加工具(需要時間較長) sudo apt-get install python-matplotlib python-scipy python-pandas python-sympy python-nose 4. 測試i…

對TypeScript進行研究

1.npm install -g typescript 在編輯器,將下面的代碼輸入到greeter.ts文件里: function greeter(person) {return "Hello, " person; } let user "Jane User"; document.body.innerHTML greeter(user); 我們使用了.ts擴展名&…

caffe 提取特征并可視化(已測試可執行)及在線可視化

網絡結構在線可視化工具 http://ethereon.github.io/netscope/#/editor 參考主頁: caffe 可視化的資料可在百度云盤下載 鏈接: http://pan.baidu.com/s/1jIRJ6mU 提取密碼:xehi http://cs.stanford.edu/people/karpathy/cnnembed/ http://lijianch…

ncnn:提取所有層特征值

官方代碼托管地址&#xff1a;https://github.com/Tencent/ncnn 在Extractor類中添加以下方法&#xff1a; int Extractor::extract_all_blobs() {for (int blob_index 0; blob_index < blob_mats.size(); blob_index){Mat outMat;extract(blob_index, outMat);// write to…

Caffe + Ubuntu 15.04/16.04 + CUDA 7.5/8.0 在服務器上安裝配置及卸載重新安裝(已測試可執行)

本文參考如下: caffe 安裝所需的所有資源可在百度網盤下載 鏈接: http://pan.baidu.com/s/1jIRJ6mU 提取密碼&#xff1a;xehi 在服務器上為每個子用戶拷貝caffe 使用 Linux探索之旅 | 第一部分第四課&#xff1a;磁盤分區完成Ubuntu安裝 Ubuntu16.04 1080Ti深度學習環境配…

ASP.NET MVC Action向視圖傳值之匿名類型

在使用ASP.NET MVC過程中想必大家都有遇到過一個問題就是我們的Action如何向視圖傳遞匿名類型的值呢&#xff0c;如果不做特殊處理則無法實現。 接下來我們來看一個示例&#xff1a; 在我們的控制中&#xff1a; using System.Collections.Generic; using System.Web.Mvc;names…

2015倫敦深度學習峰會筆記(轉載)

摘要&#xff1a;在倫敦舉行的第三屆深度學習峰會由RE.WORK主辦&#xff0c;匯集了從工業領域到學術領域不同背景的專業人士&#xff0c;本文是該峰會第一天的筆記。包括Koray Kavukcuoglu、Sander Dieleman等知名深度學習專家分享了自己的經驗。上周&#xff0c;我有機會參加在…

[webrtc] rtcp模塊中rtt時間計算

RTT指 round-trip time&#xff0c;即計算AB兩端的往返時延 這里可以分成兩個問題&#xff1a; 如何在A端估算A和B之間的RTT時間? 如何在B端估算A和B之間的RTT時間? 本文參考資料:rfc 3550rfc 3611webrtc issue https://code.google.com/p/webrtc/issues/detail?id1613以及解…

Deep learning Reading List

本文轉自&#xff1a; http://jmozah.github.io/links/ http://www.datakit.cn/blog/2014/12/31/Deep_learning_Reading_List.html 文章來自J Mohamed Zahoor的深度學習閱讀書單。 Following is a growing list of some of the materials i found on the web for Deep Learning…

商戶網站使用第三方支付的大致原理和實現

如果把商戶網站使用第三方支付平臺(比如支付寶)的原理搞清楚&#xff0c;那編程就變得簡單多了。 整個過程大致這樣&#xff1a; 1、商戶與支付寶簽約。2、在商戶網站購買商品&#xff0c;填寫數量&#xff0c;確定購買后跳轉到結賬頁面。結賬頁面可能包括訂單號、定單狀態(已支…