真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

.Net組件程序設計之遠程調(diào)用(一)-創(chuàng)新互聯(lián)

.Net組件程序設計之遠程調(diào)用(一)

在梁子湖等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供做網(wǎng)站、成都網(wǎng)站制作 網(wǎng)站設計制作按需開發(fā)網(wǎng)站,公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,成都品牌網(wǎng)站建設,全網(wǎng)整合營銷推廣,外貿(mào)營銷網(wǎng)站建設,梁子湖網(wǎng)站建設費用合理。

1應用程序域

我們知道我們寫的C#代碼是在操作系統(tǒng)邏輯體系結構中最上層的,然而操作系統(tǒng)本身是不會認識C#代碼的,它只認識機器代碼。那我們寫的程序經(jīng)過編譯后是編譯成IL的,是怎么運行的呢?實際是在一個托管的環(huán)境下運行的,是.NET提供的支持,操作系統(tǒng)是不會識別IL的,這中間就需要一個橋梁:應用程序域。操作系統(tǒng)中的進程是資源單位,應用程序域的執(zhí)行使用當然也要占用空間使用資源了,所以是物理進程承載著應用程序域的,而且這種承載關系并不是一對一的。

圖:應用程序域

.Net組件程序設計之遠程調(diào)用(一)

使用應用程序域這樣的機制,是有許多好處的。比如說客戶端在調(diào)用其他組件的時候可以創(chuàng)建一個應用程序域,然后在新建的應用程序域中加載組件進行操作等等,即使被調(diào)用的組件發(fā)生一些致命的錯誤也不會導致客戶端崩潰,有效的進行了錯誤隔離。還有一些數(shù)據(jù)交互傳輸上的性能差異等等,這里不做詳細的闡述了。

2.NET Remoting

.NET Remoting是一種基于.NET平臺的分布式系統(tǒng)框架,所了解的就是用于數(shù)據(jù)傳輸。 說幾句它被使用的局限性很大,受到了平臺的限制,當然如果僅僅是這樣是不能否定它的強大和幾乎無限擴展的框架體系,無論在哪一個環(huán)節(jié)你都可以自己來實現(xiàn)一些自定義的功能。會在下個篇幅稍作講解。

3.AppDomain

在.NET中用AppDoMain類來表示應用程序域,也提供了獲取當前應用程序域的方法,可以直接使用AppDoMain類的靜態(tài)屬性CurrentDomain來獲取到當前程序所在的應用程序域,這是一種方法,還額外提供一種了,就是Thread類的GetDomain()靜態(tài)方法也是可以獲取到的。

3.1 在當前應用程序域中創(chuàng)建對象
  1 namespace RemoteServer
 2   public class class1
 3     {
 4         private string appDoMainName;
 5 
 6         public class1()
 7         {
 8             appDoMainName = AppDomain.CurrentDomain.FriendlyName;
 9         }
10 
11         public void Writer()
12         {
13             Console.WriteLine(appDoMainName);
14         }
15     }

class1中構造函數(shù)是獲取當前應用程序域的名稱,并且是在Writer()方法中輸出到控制臺界面中,

using RemoteServer;
namespace RemoteCase
{
            AppDomain appDoMain = AppDomain.CurrentDomain;
            class1 cls1 = (class1)appDoMain.CreateInstanceFromAndUnwrap("RemoteServer.dll", "RemoteServer.class1");
            cls1.Writer();
}

圖3-1

.Net組件程序設計之遠程調(diào)用(一)

這里使用了AppDomain中的靜態(tài)方法CreateInstanceFromAndUnwrap(),因為當前項目已經(jīng)引用了RemoteServer程序集,所以第一個參數(shù)只是一個顯示的名稱,并不是全路徑,在調(diào)用方法的時候,應用程序域會加載程序集,用于獲取到元數(shù)據(jù)。

3.2 在新建應用程序域中創(chuàng)建對象
 1 namespace RemoteServer
 2       public class class1:MarshalByRefObject
 3       {
 4         private string appDoMainName;
 5 
 6         public class1()
 7         {
 8             appDoMainName = AppDomain.CurrentDomain.FriendlyName;
 9         }
10 
11         public void Writer()
12         {
13             Console.WriteLine(appDoMainName);
14         }
15       }
1 using RemoteServer;
2 
3       AppDomain appDoMain = AppDomain.CurrentDomain;
4       AppDomain newDoMain = AppDomain.CreateDomain("NewDoMain");
5       class1 cls1 = (class1)newDoMain.CreateInstanceFromAndUnwrap("RemoteServer.dll", "RemoteServer.class1");
6       cls1.Writer();

圖3-2
.Net組件程序設計之遠程調(diào)用(一)

3.3 拆包遠程對象

圖3-3-1

.Net組件程序設計之遠程調(diào)用(一)

這段代碼是3.2中的代碼,cls1并不是class1類型本身,而是代理,訪問遠程對象都是通過代理完成的,這么屌炸天的.NET當然提供優(yōu)化,將創(chuàng)建遠程對象和在客戶端建立代理分離,這樣可以在你創(chuàng)建了一個遠程對象之后再建立代理。 AppDomain類提供了一套CreateInstance()方法來創(chuàng)建對象,但是都以ObjectHandle的形式返回一個遠程對象句柄(意思就是遠程對象的唯一標示,這個句柄能代表遠程對象)

ObjectHandle對象實現(xiàn)了System.Runtime.Remoting命名空間下的IObjectHandle接口:

 1 namespace RemoteServer
 2 public class class1:MarshalByRefObject
 3     {
 4         private string appDoMainName;
 5 
 6         public class1()
 7         {
 8             appDoMainName = AppDomain.CurrentDomain.FriendlyName;
 9         }
10 
11         public void Writer()
12         {
13             Console.WriteLine(appDoMainName);
14         }
15 
16     }
 1 using RemoteServer;
 2 
 3             AppDomain appDoMain = AppDomain.CurrentDomain;
 4             AppDomain newDoMain = AppDomain.CreateDomain("NewDoMain");
 5             IObjectHandle objecthandle;
 6             objecthandle = newDoMain.CreateInstance("RemoteServer", "RemoteServer.class1");
 7 
 8             RemoteServer.class1 cls1 = objecthandle.Unwrap() as RemoteServer.class1;
 9 
10             cls1.Writer();

一般情況下是不需要手動拆包對象句柄的,這樣做的好處只是可以推遲加載RemoteServer程序集,只有在 objecthandle.Unwrap()的時候才會建立代理,而建立代理必須需要對象元數(shù)據(jù)。

4遠程對象類型

一般情況下,被引用對象和客戶端同在一個應用程序域,這樣的情況下不涉及到代理,也不會用到什么遠程調(diào)用,

而是直接引用對象,如果當你需要調(diào)用另一個應用程序域里的對象時會是什么樣的?默認情況下.NET是不允許對象跨應用程序域訪問的,

不管是不是在同一個進程內(nèi)。但是呢如果要訪問,也不是不行的,.NET提供了兩種數(shù)據(jù)傳遞方式,一種是值傳遞,一種是引用傳遞

4.1按值封送

  當應用程序域A調(diào)用應用程序域B中的對象時,應用程序域B中的對象會被拷貝一個克隆到應用程序域A,這時候兩個對象是不存在任何關系的,這種情況叫做按值封送    一般情況下都是使類型使用Serializable特性,支持序列化,通過序列化來達到按值封送的目的,在被調(diào)用方序列化,到調(diào)用方反序列化。

4.2引用封送

  這種情況就是當應用程序域A調(diào)用應用程序域B的對象時,應用程序域A獲得的是應用程序域B中對象的引用,

這個引用掛在哪里呢?掛在應用程序域A的對象代理上,這種情況就叫引用封送    引用封送就比按值封送有意思多了,想要滿足可以引用封送的要求,則對象必須繼承自MarshalByRefObject,MarshalByRefObject類型給出的解釋就是 允許在支持遠程處理的應用程序中跨應用程序域邊界訪問對象,這樣作為它的子類同樣的也享受這樣的優(yōu)待。在引用封送中會有兩種遠程對象激活模式,這個內(nèi)容在下一個篇幅中會有詳細的示例代碼。

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡助力業(yè)務部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準確進行流量調(diào)度,確保服務器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務器買多久送多久。


分享名稱:.Net組件程序設計之遠程調(diào)用(一)-創(chuàng)新互聯(lián)
路徑分享:http://weahome.cn/article/dhophp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部