早在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+ 目錄,否則註冊過程失敗)
OK,終於寫完了,接著看執行個體:
----------------------------------------------------------------------------------------------------------
using System;
using System.EnterpriseServices; // 必須引入的名空間
using System.Reflection; // 必須引入的名空間
using System.Windows.Forms;
[assembly:ApplicationName("Calcomp")]
[assembly:AssemblyKeyFileAttribute("Calcomp.snk")] //必須先註冊一個叫Calcomp.snk的強式名稱,同時注釋掉在項目裡AssemblyInfo.cs檔案中的[assembly:AssemblyKeyFileAttribute("")],否則就重複定義。
namespace Calcomp
{
public interface ICommission
{
void CommissionCal(string name,int salesamt);
}
public class Calcomp:ServicedComponent,ICommission // 繼承ServicedComponent使之成為一個服務元件
{
public void CommissionCal(string name,int salesamt)
{
double comm;
//String msgstring;
if(salesamt>=50000)
{
comm=salesamt*0.10;
MessageBox.Show(comm.ToString(),"Presto Systems");
}
if(salesamt<50000)
{
comm=salesamt*0.05;
MessageBox.Show(comm.ToString(),"Presto Systems");
}
}
}
}
OK,搞定,下面看如何調用這個服務元件
------------------------------------------------------------------------------------------------------------------
using System;
namespace CalClient
{
class Calculate
{
static void Main(string[] args)
{
Calcomp.Calcomp c=new Calcomp.Calcomp();
Console.WriteLine("please input the employeer name ");
String name=Console.ReadLine();
Console.WriteLine("please input the salesamt");
String salesamt=Console.ReadLine();
c.CommissionCal(name,int.Parse(salesamt));
}
}
}
(註:在使用服務元件之前要先在項目引用裡添加引用上面服務元件產生的DLL的引用)
----------------------------------------------------------------------------------------------------------------
關於COM+服務元件還有很多功能,此篇小文只是應用了其中一塊雞毛。