在 .NET 中使用 COM+ 服務.doc_第1頁
在 .NET 中使用 COM+ 服務.doc_第2頁
在 .NET 中使用 COM+ 服務.doc_第3頁
在 .NET 中使用 COM+ 服務.doc_第4頁
在 .NET 中使用 COM+ 服務.doc_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

在 .NET 中使用 COM+ 服務升級到 Microsoft .NET Tim McCarthy - InterKnowlogyPaul D. Sheriff - PDSA, Inc. 2002 年 2 月 摘要:將新的 Microsoft .NET 組件添加到現(xiàn)有的 COM 和 COM+ 應用程序中,它們將協(xié)同工作;如果您需要開發(fā)能夠參與事務、利用基于角色的安全性或者與隊列交互的 .NET 應用程序,這樣做對您很有幫助。 目標 學習在 Microsoft .NET 中使用 COM+ 服務。 創(chuàng)建被服務的組件。 部署被服務的組件。 前提條件要徹底理解本文內(nèi)容,需要滿足以下條件: 曾經(jīng)使用過 Microsoft Transaction Server (MTS) 并在 Microsoft Visual Basic 6.0 中分發(fā)過事務。 曾經(jīng)使用過 COM+ 服務中的基于角色的安全性。 曾經(jīng)在 COM+ 服務中創(chuàng)建和使用過隊列。 非常熟悉 .NET 類。 能夠在 .NET 中熟練創(chuàng)建控制臺應用程序。 目錄 在 .NET 中使用 COM+ 服務 開發(fā)基于事務的組件 基于角色的安全性 使用排隊組件 自 Visual Basic 6.0 以來 COM+ 的變化 總結 在 .NET 中使用 COM+ 服務您可能曾經(jīng)使用 COM+ 應用程序來托管使用 Visual Basic 或 C+ 編寫的組件。COM+ 提供了許多有價值的服務,例如事務處理、排隊組件、實時激活、基于角色的安全性、共享屬性等。使用 COM+ 托管組件的一個主要優(yōu)點在于:不必編寫任何代碼,就可以更改組件的行為方式,例如將組件的事務支持設置為“需要”。通過在組件服務 MMC 管理單元中,在 COM+ 組件上設置單選按鈕,每次創(chuàng)建組件時,都將在 COM+ 事務的上下文中創(chuàng)建相應的組件。當組件使用 COM+ 事務時,所有數(shù)據(jù)庫事務都由分布式事務處理協(xié)調(diào)器 (DTC) 處理。圖 1 顯示了在組件服務界面中設置“需要”事務選項的一個示例。圖 1:需要事務的 COM+ 組件示例設置組件安全性與設置事務支持一樣簡單。使用 COM+ 服務管理單元,您不用重新編譯代碼就可以決定哪個用戶可以運行哪個組件,甚至哪個方法。.NET 可以使用所有 COM+ 服務在 .NET 框架中,只要您的類是從 System.EnterpriseServices.ServicedComponent 類派生的,就可以繼續(xù)使用 COM+ 提供的所有服務。任何從 ServicedComponent 類派生的類都由 COM+ 服務托管,并且可以使用所有可用的 COM+ 服務。表 1 列出了 .NET 中支持的全部 COM+ 服務以及每個服務的簡短說明。表 1:可用的 COM+ 服務COM+ 服務說明自動事務處理應用聲明事務處理功能COM 事務處理集成器 (COMTI)將 CICS 和 IMS 應用程序封裝到自動化對象中補償資源管理器 (CRM)對非事務性資源應用原子性和持久性屬性實時激活通過方法調(diào)用激活對象,并在調(diào)用返回時停用此對象松散耦合的事件管理基于對象的事件對象構造在構造實例時向類實例傳遞持久字符串值對象池提供現(xiàn)成對象的池排隊組件提供異步消息隊列基于角色的安全性基于角色應用安全權限共享屬性在服務器進程中的多個對象之間共享狀態(tài)同步(活動)管理并發(fā)XA 互操作性支持 X/Open 事務處理模型在 .NET 中使用 COM+ 服務的原因如果要編寫能夠參與事務、利用基于角色的安全性或者與隊列交互作用的 .NET 應用程序,就會用到 .NET 中提供的 COM+ 服務。正如您將在本文中了解到的,.NET 使這些服務很容易實現(xiàn)。提示:如果 .NET 代碼無需與 COM+ 服務一起工作,也就是說,您只在 .NET 框架中工作,那么請不要使用 System.EnterpriseServices,否則會造成性能下降。COM+ 組件開發(fā)概述在 .NET 中創(chuàng)建與 COM+ 服務交互的組件時,需要執(zhí)行以下步驟。表 2 包含對各個步驟的說明。 1. 創(chuàng)建類庫。 2. 創(chuàng)建所有類,使它們繼承 System.EnterpriseServices.ServicedComponents 類。 3. 創(chuàng)建程序集。 4. 創(chuàng)建強名稱。 表 2:創(chuàng)建 .NET 組件時使用的術語定義 術語說明類庫包含類的 .dll 項目類型,此類項目通常沒有用戶界面System.EnterpriseServices.ServicedComponents.NET 框架中的一個類,使用它才能與 COM+ 服務進行交互程序集對項目中所有類和接口的描述強名稱從程序集生成 GUID,以便可以使用 COM+ 服務注冊組件開發(fā)基于事務的組件在本文的第一部分,您將學習如何創(chuàng)建使用 COM+ 的事務性服務的 .NET 組件,還將學習如何編寫組件以及與此組件交互的前端應用程序。創(chuàng)建 COM+ 事務組件要使 .NET 組件能夠在 COM+ 服務下運行,需要執(zhí)行以下步驟。首先,必須創(chuàng)建一個從 System.EnterpriseServices.ServicedComponent 類派生的類。這個基類提供了與 COM+ 服務交互所需的所有適當方法和屬性。需要將該類標記為需要新事務,并將所創(chuàng)建的任何方法標記為在沒有錯誤出現(xiàn)的情況下可以自動完成事務處理。下面是具體操作。 1. 打開 Microsoft Visual Studio .NET,創(chuàng)建一個新的 ClassLibrary 類型的項目。 2. 將 Class1.vb 文件重命名為 COMPlusServices.vb。 3. 打開 COMPlusServices.vb 文件,將類名 Class1 更改為 COMPlusServices。 4. 在此新類中鍵入如下所示的代碼:5. Imports System.EnterpriseServices6. Imports System.Reflection7.8. *9. COM+ 注冊詳細信息 10.11. 提供 COM+ 應用程序名 12. 13.14. 提供具有強名稱的程序集15. 17. *18.19. _20. Public Class COMPlusServices21. Inherits ServicedComponent 22.23. Public Sub New()24. MyBase.New()25. End Sub26.27. Public Function DoTransaction() _28. As String29. Return COM+ 成功30. End FunctionEnd Class此代碼以導入多個名稱空間開始,從而在聲明組件時省略了一些鍵入內(nèi)容。 31. 接下來是 COM+ 注冊詳細信息。請輸入以下代碼行:32. 提供 COM+ 應用程序名 此行指定 ApplicationNameAttribute 的值為 ComPlusExample。這是在 COM+ 目錄中注冊該 COM+ 應用程序時要使用的名稱。第一次調(diào)用此組件后,當打開 MMC 管理單元的 COM+ 應用程序文件夾時,您會發(fā)現(xiàn)應用程序名稱就是這個名稱。接下來的代碼聲明 AssemblyKeyFileAttribute 屬性:此屬性通知 COM+ 目錄有關強名稱的信息所在的位置。在后面的步驟中,將創(chuàng)建用于描述 COM+ 組件的 .SNK 文件。最后,使用以下代碼聲明類名 COMPlusServices: _ Public Public Class COMPlusServices此類名前面的屬性通知 COM+,您要將事務屬性設置為“需要”。添加此行代碼相當于打開 COM+ 應用程序管理單元(如圖 1 所示)并手動設置此屬性。該類中的下一行代碼繼承 System.EnterpriseServices 名稱空間中的 ServicedComponent。Inherits ServicedComponent 如果不包含此行,將無法使此組件在 COM+ 下運行。添加事務方法現(xiàn)在,類已經(jīng)設置完畢,可以創(chuàng)建真正能夠?qū)崿F(xiàn)某些功能的方法了。在您編寫的代碼中,DoTransaction 函數(shù)返回一個字符串值,但它只給出了您必須使用的語法,如果不使用此語法該方法將無法參與事務。 Public Function DoTransaction() As String Return COM+ 成功End Function在此方法前面加上 屬性很重要。這表示只要此方法中沒有出現(xiàn)異常,當它結束時就會自動調(diào)用 SetComplete。如果該方法中存在異常,則 .NET 運行時將自動調(diào)用 SetAbort 方法。這與在 Visual Basic 6.0 中編寫 COM 組件不同,在 Visual Basic 6.0 中,必須手動顯式調(diào)用 SetComplete 和 SetAbort。創(chuàng)建強名稱在編譯組件之前,您需要為此組件的程序集指定一個強名稱。如果不指定,COM+ 目錄將不能識別該組件,也就無法注冊它。實際上,您已經(jīng)通過前面使用的 AssemblyKeyFile 屬性指定了強名稱,現(xiàn)在需要使用強名稱工具 (Sn.exe) 創(chuàng)建強名稱并使 GUID 與程序集關聯(lián)。 1. 打開命令提示。 2. 要創(chuàng)建強名稱,請在命令提示下鍵入以下代碼,然后按 Enter 鍵。sn -k ComPlusExample.snk3. 將 ComPlusExample.snk 文件從硬盤驅(qū)動器的根目錄(通常為 C:/)復制到項目所在文件夾的 bin 目錄下。 現(xiàn)在,需要編譯此程序,使它能生成在 COM+ 注冊此組件必需的文件。在 Visual Studio .NET 中,在 Build(生成)菜單上,單擊 Build(生成)。生成客戶端測試應用程序現(xiàn)在,組件生成完畢,需要生成客戶端應用程序來調(diào)用并測試此組件。創(chuàng)建簡單的控制臺應用程序,此程序中的模塊文件的 Main 方法創(chuàng)建新組件實例,并調(diào)用 DoTransaction() 方法。以下是主要步驟: 1. 在 Visual Basic .NET 中,創(chuàng)建新的控制臺應用程序項目。 2. 添加對剛創(chuàng)建的組件的引用。 3. 鍵入如下所示的代碼。4. Module modMain5. Sub Main()6. Dim objCOMPlus As New _ 7. COMPlusJumpStart.COMPlusServices()8.9. Console.WriteLine(objCOMPlus.DoTransaction)10. Console.ReadLine()11. End SubEnd Module試一試最后,運行此程序并查看其運行情況。 1. 打開組件服務 MMC 管理單元,驗證您的組件已經(jīng)動態(tài)注冊到 COM+ 目錄中。您應該看到圖 2 所示的界面。 2. 編譯并運行控制臺應用程序。 圖 2:COM+ 目錄中的新建 .NET 服務組件 基于角色的安全性如果多個用戶調(diào)用在 COM+ 下運行的 COM 組件,您需要進行驗證,只允許特定用戶訪問某個組件。COM+ 允許您定義角色并為其分配 NT 用戶。定義并設置角色后,就可以指定哪些角色可以運行哪些組件,甚至指定可以運行組件上的哪些方法。請在此 COMPlusServices 類中添加一個方法,以添加基于角色的安全性。您需要創(chuàng)建名為 Managers 的角色,并在新方法中進行測試,查看調(diào)用者是否為 Managers 角色。添加基于角色的安全性的步驟不用直接從組件服務 MMC 管理單元修改 COM+ 應用程序來添加安全角色,只需在項目中添加一個新屬性。使用 SecurityRoleAttribute 類添加新的 Managers 角色。這個類的構造函數(shù)有兩個參數(shù):role(字符串值)和 everyone(布爾值)。role 參數(shù)指定要創(chuàng)建的角色的名稱,everyone 參數(shù)指定是否將內(nèi)置 Everyone 組添加到此角色的用戶中。 1. 在注釋“COM+ 注冊詳細信息”下鍵入以下代碼,將新的安全性角色添加到 COM+ 應用程序中。2. *3. COM+ 注冊詳細信息 4.5. 基于角色的安全性屬性 6. 更改安全級別設置,以便在進程級和組件級執(zhí)行訪問檢查。這使 COM+ 應用程序具有安全性調(diào)用上下文。 7. 顯示 COM+ 服務管理單元。 8. 單擊 Security(安全性)選項卡并更改安全級別,如圖 3 所示。 圖 3:在 COM+ 目錄中設置安全級別屬性 除了手動進行處理外,還可以在組件中添加屬性,通知組件執(zhí)行訪問級別檢查。以下是在 COMPlusServices 類一開始的“COM+ 注冊詳細信息”部分添加的代碼。 檢查安全性角色現(xiàn)在,將新方法添加到名為 IsManager 的類中。此方法將檢查用戶是否為具有 Managers 角色的成員。此方法是一個函數(shù),它返回一個布爾值,表明調(diào)用者是否為 Managers 角色。要訪問調(diào)用該方法的用戶的安全上下文,需要使用 SecurityCallContext 類。通過調(diào)用 CurrrentCall 方法,獲得當前用戶的上下文。然后調(diào)用 IsCallerInRole 方法,并傳遞 Managers 作為此角色的名稱。 1. 將以下方法添加到 COMPlusServices 類中。2. Public Function IsManager() As Boolean3.4. Dim objCallContext As SecurityCallContext = _ 5. SecurityCallContext.CurrentCall6. 7. IsManager = _ 8. objCallContext.IsCallerInRole(Managers)9.End Function現(xiàn)在,需要重新生成該組件以測試此新方法。 10. 從 Visual Studio .NET 的 Build(生成)菜單中,單擊 Rebuild Solution(重新生成解決方案)。 試一試1. 修改控制臺客戶端應用程序的 Sub Main() 方法中的代碼。此代碼應如下所示:2. Sub Main()3.4. Dim objCOMPlus As New _ 5. COMPlusJumpStart.COMPlusServices()6. 7. Console.WriteLine(objCOMPlus.DoTransaction)8. Console.WriteLine(objCOMPlus.IsManager().ToString)9. Console.ReadLine()10.End Sub11. 在命令提示下鍵入您編譯的可執(zhí)行文件的名稱,運行控制臺應用程序。 第一次運行該代碼時會發(fā)生異常,并說明訪問被拒絕的原因是 Managers 角色中沒有添加任何用戶。要糾正這個異常,請將您自己添加為 Managers 中的用戶,并再次運行該應用程序。這次應該不會出現(xiàn)任何異常。也可以在代碼中添加異常處理。以下是添加了異常處理代碼的客戶端應用程序示例:Sub Main()Try Dim objCOMPlus As New _ COMPlusJumpStart.COMPlusServices() Console.WriteLine(objCOMPlus.DoTransaction) Console.WriteLine(objCOMPlus.IsManager().ToString) Console.ReadLine()Catch objException As Exception Console.WriteLine(出現(xiàn)錯誤。 _ & 詳細信息: _ & objException.Message) Console.ReadLine()End TryEnd Sub使用排隊組件在 COM+ 應用程序中,添加排隊支持很簡單。只需確保該應用程序作為服務器程序運行(進程外),然后在選項卡上設置 Queued(排隊)和 Listen(偵聽)屬性。完成這些設置后,客戶端應用程序就可以異步或同步調(diào)用組件。該功能的精妙之處在于,不必更改 COM 對象中的代碼,只需在 COM+ 目錄中更改其屬性。.NET 框架支持排隊組件,而且,正如您期望的那樣,您可以通過使用屬性,而不用手動更改 COM+ 目錄即可為組件提供排隊支持。請在 COMPlusServices 類中添加一個方法,然后在 .NET 客戶端應用程序中使用 COM+ 排隊組件服務異步調(diào)用它。 1. 將 COM+ 應用程序作為服務器程序(進程外)。這是排隊組件的要求。要使用屬性達到此目的,請將以下代碼添加到項目中:2. *3. COM+ 注冊詳細信息 4.5. 在組件中添加排隊支持。使組件可訪問 MSMQ 隊列,并使其偵聽自己的隊列以處理消息。下面是使用屬性完成此過程的代碼:6. *7. COM+ 注冊詳細信息 8.9. 10. 在類 QueueTest 中添加一個方法。確保它是子例程且不返回任何值。使用它在 Windows 應用程序日志中寫入信息。此代碼應如下所示:11. Public Sub QueueTest()12. System.Diagnostics.EventLog.WriteEntry(_ 13. COMPlusServces, 隊列測試, _ 14. Diagnostics.EventLogEntryType.Error)End Sub就到這里吧。這就是為使組件成為 COM+ 排隊組件需要完成的全部操作。試一試現(xiàn)在,應該通過創(chuàng)建另一個控制臺應用程序并調(diào)用此組件,來嘗試運行該排隊組件。 1. 創(chuàng)建新的控制臺應用程序。 2. 將以下代碼添加到控制臺應用程序的 Sub Main 過程中。3. Sub Main()4. Dim objTest As COMPl

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論