C#強化系列文章六:應用程式定義域(AppDomain)淺析

來源:互聯網
上載者:User
在以前傳統的開發中我們都知道,一個應用程式對應一個進程,並為該進程指定虛擬記憶體,由作業系統來映射實際的實體記憶體,有效維護了進程之間的安全性。但另一方面,每一個進程都會消耗一定的系統資源,降低了效能,並且進程間的通訊也比較麻煩。
在.Net中推出了一個新的概念:應用程式定義域(AppDomain)。可以理解成很多應用程式定義域都可以運行在同一個.NET的進程中,可以降低系統消耗,同時不同的域之間互相隔離,在安全性方面有保障。另外對於同一個進程內不同域之間的通訊也相對簡單一點。
應用程式定義域涉及的內容很多,本文就簡要描述以下兩個方面:
1、如何建立、卸載域
2、如何?域間的通訊

一、如何建立、卸載域
在.NET中提供了AppDomain類為執行Managed 程式碼提供隔離、卸載和安全邊界。1            AppDomainSetup info = new AppDomainSetup();
2            info.LoaderOptimization = LoaderOptimization.SingleDomain;
3
4            AppDomain domain = AppDomain.CreateDomain("MyDomain", null, info);
5            domain.ExecuteAssembly("C:\\test\\DomainCom.exe");
6            AppDomain.Unload(domain);
7

1、使用AppDomainSetup類定義新域的屬性,比如可以設定應用程式的根目錄,設定被載入程式的類別。
例子中使用的是SingleDomain表示載入程式不得在應用程式定義域之間共用內部資源,還可以使用MultiDomain、MultiDomainHost等其他屬性
2、在第四行建立一個名字為MyDomain的新域
3、在第5行在新域內部執行一個應用程式
4、第6行卸載這個新域
通過這樣建立後,新域的執行就算出現系統異常也不會影響到原來域的執行,那麼就可以做類似WatchDog(監控子程式,一旦退出就重啟)的程式了

二、如何?域間的通訊

公用語言運行庫禁止在不同域中的對象之間進行直接調用,但我們可以複製這些對象,或通過代理訪問這些對象 1            AppDomainSetup info2 = new AppDomainSetup();
 2            info2.LoaderOptimization = LoaderOptimization.SingleDomain;
 3            info2.ApplicationBase = "C:\\test";
 4            AppDomain domain2 = AppDomain.CreateDomain("MyDomain2", null, info2);
 5            ObjectHandle objHandle = domain2.CreateInstance("DomainCom", "DomainCom.TestStatic");
 6            ICollection obj = objHandle.Unwrap() as ICollection;
 7            int i = obj.Count;
 8            domain2.ExecuteAssembly("C:\\test\\DomainCom.exe");
 9            AppDomain.Unload(domain2);

開始的代碼都差不多,重點是以下幾個方面:
1、第5行在新域中建立一個對象(類DomainCom.TestStatic),並返回一個代理ObjectHandle 類用於在多個應用程式定義域之間傳遞對象
DomainCom.TestStatic必須從MarshalByRefObject類繼承,為了示範方便,這個類很簡單,從ICollection介面繼承,就實現了一個Count屬性:using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace DomainCom
{
    public class TestStatic : MarshalByRefObject, ICollection
    {
        private static int count = 1;

        public int Count
        {
            get
            {
                count = count * 2;
                return count;
            }
        }

        未實現代碼#region 未實現代碼
        public bool IsSynchronized { get { throw new NotImplementedException(); } }

        public object SyncRoot { get { throw new NotImplementedException(); } }

        public void CopyTo(Array array, int index)
        {
            throw new NotImplementedException();
        }
        public IEnumerator GetEnumerator()
        {
            throw new NotImplementedException();
        }
        #endregion
    }
}

2、第6行取得新域中的對象
3、在第七在當前域中給新域中的對象賦值
4、第8行執行新域中的應用程式,這個應用程式中就是彈出一個對話方塊顯示Count的值            TestStatic test = new TestStatic();
            MessageBox.Show(test.Count.ToString());

得到的結果為4,證明實現了域間對象的互操作,這樣我們就可以實現其他更複雜的操作了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.