如何在.NET中创建服务型组件
生活随笔
收集整理的這篇文章主要介紹了
如何在.NET中创建服务型组件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
作者:張勁松??? 本文選自:賽迪網? 2002年12月03日?
?
對于在WINDOWS上作過一些開發的程序員來說,COM+應該是不會感到陌生的吧。COM+代表了Microsoft在COM技術平臺上的最高水平,也是Microsoft藉以和J2EE抗衡的支點(J2EE里的核心思想其實也從COM+的前身MTS中借鑒了許多)。事實上,COM+確實是非常出色的產品,對于中等難度的項目,用VB6加COM+的確是一個非常快速高效的技術組合。更值得一提的是COM+是完全免費的。只要你擁有了WINDIWS 2000或是XP。
在.NET推出后,人們似乎忘記了COM+。但如果你留心一下Microsoft技術發展的動向,你就不難發現在今后一到兩年內,COM+不會退出WINDOWS舞臺。它的許多服務功能還是.NET在短時間內無法替代的。比如說,COM+提供的實例管理(Instance management),交易處理(Transactions),斷開連接的異步隊列組件(Disconnected asynchronous queued components),基于角色的安全機制(Role-based securiry)等等。所以在今后一段時間內將是新舊技術結合,COM逐漸向.NET過渡的情形。在這種大的技術背景下,學習如何用.NET來編寫在COM+中運行的組件還是非常有意義的。
本文將結合一個小的例程向大家描述一下開發SERVICED COMPONENTS的基本流程、技術要點以及實際開發工作中應遵循的一些基本原則。
SERVICED COMPONENT簡介
SERVICED COMPONENT是指用任何和.NET CLS相兼容的程序語言開發的類。它必須直接或間接的派生于System.EnterpriseService.ServicedComponent這一基類。這樣開發的類可以在COM+的環境中運行,調用COM+的服務。在.NET開發環境里,可供調用的COM+服務有
· Automatic Transaction Processing )(自動交易處理)
· COM Transaction Integrator (COMTI) (COM交易集成)
· Compensating Resource Managers (CRMs) (補償性資源管理者)
· Just-In-Time Activation(即時激活)
· Loosely Coupled Events(松散連接事件)
· Object Construction (對象創建)
· Object Pooling(對象循環)
· Queued Components(隊列組件)
· Role-Based Security(基于角色的安全)
· Shared Properties(共享的屬性)
· Synchronization (Activity) (同步)
· XA Interoperability (XA的互操作)
SERVICED COMPONENT的開發流程
創建類庫文件(Class Libray)
如例程所示,用戶編寫的類它必須直接或間接的派生于ServicedComponent基類
生成鑰匙文件(Key)
在COM+環境里運行的SERVICED COMPONENT必須是被簽署的(有STRONG NAME),所以你開發的組件要用"鑰匙"文件來簽署。鑰匙文件可以用.NET提供的工具sn.exe來生成。最簡單的方法是從VISUAL STUDIO提供的COMMNAD PROMPT打開一個DOS窗口,執行如下命令:
?
?????
?你可以在源程序里加入COM+相關的屬性,這些屬性將反映到COM+的設置中。但這不是必須的。你可以不在程序里設置COM+相關的屬性,而是等組件發布后,在COM+提供的"組件服務瀏覽器"里設置組件的屬性。在你手工設置之前,COM+會給你的組件設以缺省值。
COM+可設置的屬性非常多,這里僅用幾個最常見的來示意一下。??????????
發布組件
SERVICED COMPONENT發布是相對比較復雜的一步。本文不想就COM+注冊的原理和細節展開討論,只就最基本的兩種發布方法做一介紹。要注意的一點是發布組件涉及到對COM+的目錄(Catelog)進行改動,所以操作者必須有管理員的權限。
a. 動態發布
動態發布不需要手工將組件安裝在COM+環境中,程序在運行的時候自動安裝組件到COM+中去(只有用.NET開發的客戶端程序才可以在運行時將組件安裝到COM+中,傳統的COM客戶程序沒有這一功能)。當管制客戶端程序(Managed Client Application)第一次調用SERVICED COMPONENT時,.NET運行時會自動偵測到SERVICED COMPONENT還沒有注冊安裝到COM+環境里,于是.NET運行時將根據該組件的屬性將它注冊安裝到COM+中去,并響應客戶程序的調用。以后客戶程序再次調用該組件的函數時,已經安裝的組件會直接響應調用。
在管制客戶第一次調用SERVICED COMPONENT服務的時,.NET在幕后進行注冊和屬性設置,你會感到有非常明顯的延遲。在筆者的計算機上(1.13GHZ SONY NOTEBOOK),這一過程要花費大約12秒。好在這一注冊和安裝過程只發生一次。
動態發布的好處就是非常的簡單,用戶只需要把編譯好的組件(DLL ASSEMBLY)拷貝到客戶端應用程序的目錄下就可以了。.NET運行時會接管余下的事情。
b. 手工發布
手工發布比動態發布要麻煩一些,但你有更多的控制。另外動態發布要求客戶端程序目錄下有一份編譯好的組件拷貝。如果計算機上有多個客戶端程序的話,那就意味著該計算機上有多份同樣組件的拷貝。除了冗余以外,將來的組件升級也會有一些潛在的問題。在這種情況下,你可能更愿意將組件放到"公共匯編緩沖池去(GAC)"。手工發布組件你需要.NET提供的公共匯編緩沖池工具Gacuti.exe和服務安裝工具Regsvcs.exe。就文中給出的例程而言,你需要在DOS窗口中鍵入以下命令。
客戶端程序的開發
用.NET開發的SERVICES COMPONENT可以被.NET的客戶程序以及傳統的COM客戶程序所調用。下面給出兩個小的例程來示范一下。
a. .NET客戶程序
用.NET開發客戶程序沒有說明特別的。只需要引用開發好的組件就可以了。如果組件被安裝到了"公共匯編緩沖池去(GAC)"中,那么客戶端程序就不需要一份專用的拷貝了。
b. 用VB6開發的COM客戶程序
在VB的集成開發環境里新建一個工程,在工程引用(Project Reference)中加入bank.tlb(當你在在運行Regsvcs.exe 時,類庫文件(Type Library)會自動生成),然后可以加入如下程序
使用SERVICED COMPONENT的注意事項
1. 考慮客戶端程序
在開發SERVICED COMPONENT時,要注意什么樣的客戶程序會使用它。 因為COM客戶程序和用.NET開發的客戶程序對SERVICED COMPONENT有不同的要求。如果將來有基于COM的客戶程序,那么要在開發組件中注意以下幾點:
· 不要使用帶參數的創建函數(Parameterized constructors)
· 不要使用靜態函數 (Static function)
· 定義事件源接口(Event-source interfaces)
· 在用戶定義的異常(User-defined Exceptions)中包含HRESULTs
2. 慎重使用SERVICED COMPONENT
在COM+環境中運行.NET開發的組件要通過COM->.NET中間層,并且COM到COM+還會引入一層CONTEXT LAYER. 這對程序的性能有很大的影響。你如果運行一下本文提供的小程序有就會有一些感性認識。另外,在理論上講,使用SERVICED COMPONENT會影響程序的可移植性。因為COM+必盡是Microsoft專有的技術,其它平臺如LINUX即使移植.NET,也不會移植這部分功能。所以只有在真正需要COM+提供的服務,比如跨數據源的交易處理,基于角色的安全管理的時候,再使用SERVICED COMPONENT這一技術。
SERVICED COMPONENT其它用法
本文僅是對如何開發SERVICED COMPONENT作了一個簡單的介紹。全面掌握SERVICED COMPONENT還需要進一步的工作。筆者將在隨后的文章中進一步介紹如隊列組件(Queued Component),松散連接的事件(Loosely Couple Events)等等比較復雜的功能和用法。
?
對于在WINDOWS上作過一些開發的程序員來說,COM+應該是不會感到陌生的吧。COM+代表了Microsoft在COM技術平臺上的最高水平,也是Microsoft藉以和J2EE抗衡的支點(J2EE里的核心思想其實也從COM+的前身MTS中借鑒了許多)。事實上,COM+確實是非常出色的產品,對于中等難度的項目,用VB6加COM+的確是一個非常快速高效的技術組合。更值得一提的是COM+是完全免費的。只要你擁有了WINDIWS 2000或是XP。
在.NET推出后,人們似乎忘記了COM+。但如果你留心一下Microsoft技術發展的動向,你就不難發現在今后一到兩年內,COM+不會退出WINDOWS舞臺。它的許多服務功能還是.NET在短時間內無法替代的。比如說,COM+提供的實例管理(Instance management),交易處理(Transactions),斷開連接的異步隊列組件(Disconnected asynchronous queued components),基于角色的安全機制(Role-based securiry)等等。所以在今后一段時間內將是新舊技術結合,COM逐漸向.NET過渡的情形。在這種大的技術背景下,學習如何用.NET來編寫在COM+中運行的組件還是非常有意義的。
本文將結合一個小的例程向大家描述一下開發SERVICED COMPONENTS的基本流程、技術要點以及實際開發工作中應遵循的一些基本原則。
SERVICED COMPONENT是指用任何和.NET CLS相兼容的程序語言開發的類。它必須直接或間接的派生于System.EnterpriseService.ServicedComponent這一基類。這樣開發的類可以在COM+的環境中運行,調用COM+的服務。在.NET開發環境里,可供調用的COM+服務有
· Automatic Transaction Processing )(自動交易處理)
· COM Transaction Integrator (COMTI) (COM交易集成)
· Compensating Resource Managers (CRMs) (補償性資源管理者)
· Just-In-Time Activation(即時激活)
· Loosely Coupled Events(松散連接事件)
· Object Construction (對象創建)
· Object Pooling(對象循環)
· Queued Components(隊列組件)
· Role-Based Security(基于角色的安全)
· Shared Properties(共享的屬性)
· Synchronization (Activity) (同步)
· XA Interoperability (XA的互操作)
創建類庫文件(Class Libray)
如例程所示,用戶編寫的類它必須直接或間接的派生于ServicedComponent基類
//例程的文件名是Bank.cs
using System.EnterpriseServices;
using System.Runtime.CompilerServices;
using System.Reflection;
namespace BankComponent
{//繼承ServicedComponent
public class Account : ServicedComponent{public bool transfer(int from_Account, int to_Account, double amount){//銀行轉帳的實現細節,這里從略return true;} }
} |
生成鑰匙文件(Key)
在COM+環境里運行的SERVICED COMPONENT必須是被簽署的(有STRONG NAME),所以你開發的組件要用"鑰匙"文件來簽署。鑰匙文件可以用.NET提供的工具sn.exe來生成。最簡單的方法是從VISUAL STUDIO提供的COMMNAD PROMPT打開一個DOS窗口,執行如下命令:
?????
?你可以在源程序里加入COM+相關的屬性,這些屬性將反映到COM+的設置中。但這不是必須的。你可以不在程序里設置COM+相關的屬性,而是等組件發布后,在COM+提供的"組件服務瀏覽器"里設置組件的屬性。在你手工設置之前,COM+會給你的組件設以缺省值。
發布組件
動態發布不需要手工將組件安裝在COM+環境中,程序在運行的時候自動安裝組件到COM+中去(只有用.NET開發的客戶端程序才可以在運行時將組件安裝到COM+中,傳統的COM客戶程序沒有這一功能)。當管制客戶端程序(Managed Client Application)第一次調用SERVICED COMPONENT時,.NET運行時會自動偵測到SERVICED COMPONENT還沒有注冊安裝到COM+環境里,于是.NET運行時將根據該組件的屬性將它注冊安裝到COM+中去,并響應客戶程序的調用。以后客戶程序再次調用該組件的函數時,已經安裝的組件會直接響應調用。
在管制客戶第一次調用SERVICED COMPONENT服務的時,.NET在幕后進行注冊和屬性設置,你會感到有非常明顯的延遲。在筆者的計算機上(1.13GHZ SONY NOTEBOOK),這一過程要花費大約12秒。好在這一注冊和安裝過程只發生一次。
動態發布的好處就是非常的簡單,用戶只需要把編譯好的組件(DLL ASSEMBLY)拷貝到客戶端應用程序的目錄下就可以了。.NET運行時會接管余下的事情。
b. 手工發布
手工發布比動態發布要麻煩一些,但你有更多的控制。另外動態發布要求客戶端程序目錄下有一份編譯好的組件拷貝。如果計算機上有多個客戶端程序的話,那就意味著該計算機上有多份同樣組件的拷貝。除了冗余以外,將來的組件升級也會有一些潛在的問題。在這種情況下,你可能更愿意將組件放到"公共匯編緩沖池去(GAC)"。手工發布組件你需要.NET提供的公共匯編緩沖池工具Gacuti.exe和服務安裝工具Regsvcs.exe。就文中給出的例程而言,你需要在DOS窗口中鍵入以下命令。
客戶端程序的開發
用.NET開發的SERVICES COMPONENT可以被.NET的客戶程序以及傳統的COM客戶程序所調用。下面給出兩個小的例程來示范一下。
a. .NET客戶程序
用.NET開發客戶程序沒有說明特別的。只需要引用開發好的組件就可以了。如果組件被安裝到了"公共匯編緩沖池去(GAC)"中,那么客戶端程序就不需要一份專用的拷貝了。
using BankComponent;
using System;
namespace BankComponentConsoleClient
{class Client{public static int Main() {bool bo = false;int start = Environment.TickCount;Account act = new Account();bo = act.transfer(123,234,50.0);int end = Environment.TickCount;Console.WriteLine(Peformance: " + (end-start));return 0;}}
} |
b. 用VB6開發的COM客戶程序
在VB的集成開發環境里新建一個工程,在工程引用(Project Reference)中加入bank.tlb(當你在在運行Regsvcs.exe 時,類庫文件(Type Library)會自動生成),然后可以加入如下程序
Private Sub Command1_Click()Dim obj As New AccountDim bool As Booleanbool = obj.transfer(123,234,50.0) MsgBox "The Result is " & bool End Sub |
1. 考慮客戶端程序
在開發SERVICED COMPONENT時,要注意什么樣的客戶程序會使用它。 因為COM客戶程序和用.NET開發的客戶程序對SERVICED COMPONENT有不同的要求。如果將來有基于COM的客戶程序,那么要在開發組件中注意以下幾點:
· 不要使用帶參數的創建函數(Parameterized constructors)
· 不要使用靜態函數 (Static function)
· 定義事件源接口(Event-source interfaces)
· 在用戶定義的異常(User-defined Exceptions)中包含HRESULTs
2. 慎重使用SERVICED COMPONENT
在COM+環境中運行.NET開發的組件要通過COM->.NET中間層,并且COM到COM+還會引入一層CONTEXT LAYER. 這對程序的性能有很大的影響。你如果運行一下本文提供的小程序有就會有一些感性認識。另外,在理論上講,使用SERVICED COMPONENT會影響程序的可移植性。因為COM+必盡是Microsoft專有的技術,其它平臺如LINUX即使移植.NET,也不會移植這部分功能。所以只有在真正需要COM+提供的服務,比如跨數據源的交易處理,基于角色的安全管理的時候,再使用SERVICED COMPONENT這一技術。
本文僅是對如何開發SERVICED COMPONENT作了一個簡單的介紹。全面掌握SERVICED COMPONENT還需要進一步的工作。筆者將在隨后的文章中進一步介紹如隊列組件(Queued Component),松散連接的事件(Loosely Couple Events)等等比較復雜的功能和用法。
總結
以上是生活随笔為你收集整理的如何在.NET中创建服务型组件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为.Net程序集添加资源
- 下一篇: 浅析.Net下的AppDomain编程