net下開發COM+組件(一)

來源:互聯網
上載者:User
閱讀提示:本文介紹了在.net下如何開發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("http://www.cnblogs.com/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 一下就可以直接用其中的方法了。

自 http://hi.baidu.com/espeak/blog/item/0561e06e4d33b7d980cb4acb.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.