国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

.net下開發COM+組件

2024-07-10 12:58:39
字體:
來源:轉載
供稿:網友
一、問題的提出:(下面舉出我遇到的問題)
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("../../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 一下就可以直接用其中的方法了。





發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 西乡县| 高州市| 平乐县| 都匀市| 尉氏县| 醴陵市| 喀什市| 曲麻莱县| 防城港市| 攀枝花市| 溧阳市| 河北省| 荣成市| 潞城市| 左云县| 邻水| 东丽区| 芜湖市| 五大连池市| 广水市| 永宁县| 凤翔县| 扎赉特旗| 三明市| 玉溪市| 昂仁县| 宣恩县| 石阡县| 东安县| 遵化市| 永春县| 怀远县| 安乡县| 镇康县| 英超| 吴江市| 织金县| 青海省| 壤塘县| 利津县| 耿马|