熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> ASP編程 >> 正文

dotnet 下開發 COM+ 組件

2022-06-13   來源: ASP編程 

  問題的提出

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

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

  分析解決問題

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

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

  COM+組件介紹

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

  事務服務它確保了在分布式系統中的數據完整性

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1手動注冊通過RegSvcsexe命令行工具來注冊Regsvcs yourcomponentdll 之後將產生一個yourcomponenttlb類型庫包含了對象的類型信息(注意在使用該命令前必須先注冊一個yourcomponent的強名稱)

  2編程注冊使用RegistrationHelper類主要是利用在IregistrationHelper接口中的方法

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

  實例剖析

  首先新建一個類庫(在我的項目裡叫XMLOperate)

  它會生成兩個文件AssemblyInfocs和Classcs(我把Classcs改成了Maincs具體名稱可以自己定)

  添加引用(SystemEnterpriseServices )

  回到Maincs

  using System

  using SystemReflection

  using SystemRuntimeInteropServices

  using SystemEnterpriseServices

  namespace XMLOperator

  {

  /// <summary>

  /// OMPmSAXMLOperator 的摘要說明

  /// </summary>

  [ObjectPooling(MinPoolSize= MaxPoolSize=)]

  [JustInTimeActivation(true)]

  [ClassInterface(ClassInterfaceTypeAutoDual)]

  public class XMLOperate ServicedComponent

  {

  protected override void Construct(string constructString)

  {

  baseConstruct(null)

  }

  protected override void Activate(){}

  protected override void Deactivate(){}

  protected override bool CanBePooled(){return true}

  protected override void Dispose(bool disposing)

  {

  baseDispose(disposing)

  }

  ///

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

  ///

  [AutoComplete]

  public string visit(string name)

  {

  return 歡迎 + name

  }

  }

  }

  回到AssemblyInfocs添加引用using SystemEnterpriseServices

  添加代碼

  //將組件設置為服務器啟動模式

  [assembly ApplicationActivation(ActivationOptionServer) ]

  //制定應用服務器名稱

  [assembly ApplicationName(XMLOperate)]

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

  D\work\XMLOperate> sn k XMLOperatesnk

  XMLOperatesnk為生成的文件名稱( 執行完成後文件裡會多出一個文件serversnk )

  強名稱生成完後回到程序中在AssemblyInfocs中最後幾排可以發現[assembly AssemblyKeyFile( )]把文件路徑寫進去[assembly AssemblyKeyFile(……/……/XMLOperatesnk)]

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

  我的項目中是這樣的

  D\work\XMLOperate\obj\debug > regsvcs XMLOperatedll

  這樣服務器就構建完成

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

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

  建立客戶端

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

  加入引用

  using SystemEnterpriseServices

  using XMLOperate

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


From:http://tw.wingwit.com/Article/program/ASP/201311/21757.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.