dotnet 下開發 COM+ 組件

轉載:

一、問題的提出

    1、最終用戶的每次請求,都將讀取Mapping文件——可以通過緩存解決;

    2、xxx子系統需要不斷的寫入Mapping文件——也可以先寫入內存然後批量寫入文件解決;

    二、分析解決問題

    由於分別有2個或更多子系統需要對同一文件進行讀寫操作,而客戶端又有很大的併發性,所以極可能出現讀寫衝突或錯誤,也必將影響系統的性能。

    通過調用共同的進程外組件的方式來讀寫文件;而這個共同的進程外組件只有在自身啓動的時候把文件內容load到內存,當文件有變化時更新內存。

    三、COM+組件介紹

    早在window2000發佈時就已經產生了COM+,並集成在操作系統中,在運行的時候是以服務的形式存在的。COM+增加了一系列的MTS(一種系統服務,用於管理數據庫中的持久性數據,也處理在事務中的持久性消息隊列和文件系統)服務:

    1、事務服務:它確保了在分佈式系統中的數據完整性。

    2、安全服務:它的安全模型提供了處理安全性而不用編寫任何代碼的方法。

    3、同步服務:提供了有管理地解決組件中併發問題的方法,但卻不用編寫代碼。

    4、資源管理:(包括資源管理器和資源分配器)管理數據庫連接、網絡連接和內存等。

    5、JIT激活:即(Just In Time)是從MTS繼承下來的一項服務,當客戶調用時纔將該對象的一個實例保持爲活躍狀態並緩存在服務器內存中,使用完對象後,會通知MTS環境可以釋放該對象所佔用的資源了,如數據庫連接。

    6、對象池:提供一個線程池來存放現成的對象,以供下次再用,是系統的一項自動服務。當有應用程序訪問COM+組件時,即爲應用程序創建該組件的一個實例並存放在對象池中,應用程序關閉後即銷燬實例,可以自由配置組件使它的實例在池中的狀態,實現了實例的重用性,提高應用程序的性能和伸縮性。

    7、基於角色的安全:這個容易理解,即驗證角色,給予安全許可,給不同的用戶予不同的權限。

    8、隊列組件(MSMQ):提供異步消息隊列,可以自動按其形式將數據轉換成數據包。

    9、共享屬性管理器(SPM):用來管理存儲在內存中的對象狀態信息,在一個服務器進程內可以用來共享多個對象間的狀態,並提供併發處理。

    10、補償資源管理器(CRM):用於在處理事務期間生成日誌文件並可處理系統崩潰。包括CRM工作器(是CRM的主要部分,通過CRM的基礎設施提供的接口將事務的相關信息寫入日誌,並在需要時檢索日誌文件)和CRM補償器(用於在事務完成後,將事務和生成的日誌文件提交給執行事務的用戶)。

    11、併發:即允許一個應用程序中的多個進程同時運行,進程被分成各組上下文(有相同需求的對象集合)包含在單元(一個進程內的一組上下文)中,一個進程可包含多個上下文,都涉及到不同的需求的對象而且每個上下文都有一個唯一的COM對象來提供COM+事務處理和JIT激活等服務。利用COM+提供的工具可以創建執行交易的多層應用程序,還可以處理線程分配的問題。OK,介紹完COM+的功能下面再介紹COM+的類型。

    COM+有幾種不同用途的類型:

    1、應用程序代理:包含應用程序註冊信息的文件,即當有客戶訪問遠程計算機的服務器程序時,運行在客戶端的應用程序代理就會將服務器應用程序的信息寫入客戶端器計算機中。

    2、服務器應用程序:即在COM+應用程序本身的進程內執行COM+應用程序,同時使用併發性來處理組件。

    3、庫應用程序:是在客戶應用程序的進程內執行的,裝載在客戶應用程序進程內的,使用基於任務的安全性,缺點是不支持遠程訪問和隊列組件。

    4、COM+預安裝應用程序:到管理工具中的組件服務中的COM+應用程序文件夾中查看就明白什麼是COM+預安裝應用程序了,它是在COM+安裝過程中自動安裝進組件服務的應用程序,不能修改也不能刪除。

    同時涉及到一個叫“程序集(Assembly )”的概念:它是CLR所有類型和其它資源(如位圖文件等)的集合。可通過管理工具下的“配置。NET框架”來查看。包括有私有和共享的程序集。私有程序集:它只能被放在與該程序集相同路徑的應用程序訪問。默認爲私有,必須放在使用它的應用程序的文件夾中。共享程序集:指添加在GAC(Global Assembly Cache)中的程序集。GAC是專門用來存放程序集中,使應用程序可以共享這些程序集,有一點必須注意,就是存放在GAC中的程序集必須有一個唯一的名字,可以通過在。NET命令執行窗口中打入sn -k assemblyname.snk 來生成一個唯一的名稱,叫做強名稱,生成強名稱後,會有一個公鑰附加在此程序集上,用於阻止名字相似而被代替的危險。

    。NET中對程序集的安全性提供了兩種機制:一種是前面提到的強名稱,一種是使用Signcode(可理解爲數字簽名)。Signcode.exe用來標記一個程序集,同時嵌入一個數字簽名到程序集中,可以讓用戶識別創建此程序集的開發者。

    (注:在GAC中不能有兩個相同名稱的強名稱,否則就不叫強名稱了,但可以存儲一個程序集的多個拷貝而且在GAC中的程序集只能被擁有一定權限的用戶刪除)

    關於程序集的版本號:每一個版本都有一個128位的版本號,表示爲四部分:Major(爲主版本號,項目有變化時即改變)。Minor(添加一個功能到項目時改變)。Build.Revision(後兩個是自動更新的),這些版本信息可以通過在應用程序中的AssemblyInfo.cs文件來查看。

    又是一堆的理論,下面介紹COM+的應用:在。NET中使用COM+服務的組件就叫做。NET服務組件,跟一般的組件不同,區別在於前者使用了COM+服務。使用。NET服務組件的目的也就是爲了可以訪問COM+服務的一些基類如ServicedComponent和自動事務處理,JIT,對象池和安全性方面等。

    在使用。NET服務組件之前都必須註冊服務組件,有三種方式

    1、手動註冊:通過RegSvcs.exe命令行工具來註冊,如:Regsvcs yourcomponent.dll 之後將產生一個yourcomponent.tlb類型庫,包含了對象的類型信息(注意在使用該命令前必須先註冊一個yourcomponent的強名稱)

    2、編程註冊:使用RegistrationHelper類,主要是利用在IregistrationHelper接口中的方法。

    3、動態註冊:是指在執行應用程序過程中,檢查安裝組件的版本,如組件的正確版本沒安裝,則在運行時自動安裝需要的版本,即自動註冊。(注:調用自動註冊的用戶必須是Window2000 Administrative組的一個成員,因爲動態註冊無法改變COM+ 目錄,否則註冊過程失敗)

四、實例剖析

    1、首先新建一個類庫。(在我的項目裏叫XMLOperate)

    它會生成兩個文件,AssemblyInfo.cs和Class1.cs(我把Class1.cs改成了Main.cs,具體名稱可以自己定)

    2、添加引用(System.EnterpriseServices )

    3、回到Main.cs:

    using System;

    using System.Reflection;

    using System.Runtime.InteropServices;

    using System.EnterpriseServices;

    namespace XMLOperator

    {

    /// <summary>

    /// OMPmSAXMLOperator 的摘要說明。

    /// </summary>

    [ObjectPooling(MinPoolSize=0, MaxPoolSize=1)]

    [JustInTimeActivation(true)]

    [ClassInterface(ClassInterfaceType.AutoDual)]

    public class XMLOperate : ServicedComponent

    {

    protected override void Construct(string constructString)

    {

    base.Construct(null);

    }

    protected override void Activate(){}

    protected override void Deactivate(){}

    protected override bool CanBePooled(){return true;}

    protected override void Dispose(bool disposing)

    {

    base.Dispose(disposing);

    }

    ///

    ///把我的很多方法都去掉了,寫個簡單的visit來演示一下就OK了。

    ///

    [AutoComplete]

    public string visit(string name)

    {

    return "歡迎 " + name;

    }

    }

    }

    4、回到AssemblyInfo.cs,添加引用using System.EnterpriseServices;

    添加代碼:

    //將組件設置爲服務器啓動模式。

    [assembly: ApplicationActivation(ActivationOption.Server) ]

    //制定應用服務器名稱

    [assembly: ApplicationName("XMLOperate")]

    5、接下來,給服務器程序一個強名稱(相當於註冊)。打開 Visual Studio .Net2003 (也許你用的是2005)命令提示,找到文件的地址,輸入sn -k ,生成密匙比如我的文件在D盤,work中,

    D:/work/XMLOperate> sn -k XMLOperate.snk

    XMLOperate.snk爲生成的文件名稱,( 執行完成後,文件裏會多出一個文件server.snk )

    6、強名稱生成完後,回到程序中,在AssemblyInfo.cs中最後幾排,可以發現[assembly: AssemblyKeyFile(" ")],把文件路徑寫進去[assembly: AssemblyKeyFile("……/……/XMLOperate.snk")]

    7、生成解決方案,在OBJ / debug 中會有個XMLOperate.dll,回到Visual Studio .Net2003 命令提示,到文件obj/debug目錄下,執行regsvcs 命令,註冊服務。(完全可以不用手工註冊,在步驟9中,客戶端調用new的時候的時候如果沒有註冊該組件服務,則系統會自動註冊,詳細請見(三)部分最後的註冊方式。)

    我的項目中是這樣的

    D:/work/XMLOperate/obj/debug > regsvcs XMLOperate.dll;

    這樣,服務器就構建完成。

    打開我的電腦,控制面板,管理工具,組件服務,com+應用程序,現在我們可以看到com+中多了個,XMLOperate這個就是剛所建的服務器。

    8、在XMLOperate上按右鍵,打開屬性,修改安全性:調用身份驗證級別爲:無,模擬級別爲標識。授權下的勾去掉( 這些是根據情況需要更改的,現在僅僅做個本機上的列子)。然後找到激活,遠程服務器名稱改成你自己機器的IP地址。

    9、建立客戶端。

    建一個winfrom(在我的項目裏其實有1個web service和一個window service來調用XMLOperate)

    加入引用:

    using System.EnterpriseServices;

    using XMLOperate;

    在客戶端要引用的地方new 一下就可以直接用其中的方法了。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章