1. 編寫(xiě)Com+組件
在建立C#工程之后必須要給類一個(gè)強(qiáng)名稱.
??? 要?jiǎng)?chuàng)建強(qiáng)名稱,可以使用 sn 工具.此命令行工具有許多選項(xiàng),在命令提示符處鍵入 sn /? 可以查看所有選項(xiàng).對(duì)程序集簽名所需的選項(xiàng)是“-k”,它將創(chuàng)建一個(gè)密鑰文件.默認(rèn)情況下,該文件使用 .snk 作為擴(kuò)展名.例如,要?jiǎng)?chuàng)建一個(gè)名為 MyCom.snk 的密鑰文件,可以使用以下命令行:
sn -k MyCom.snk
然后在工程中引用這個(gè)強(qiáng)名稱
方法如下:
( 1 ):注釋掉AssemblyInfo.cs中的[assembly:?
AssemblyKeyFile
( "" )]和[assembly:?
AssemblyKeyName
( "" )]
( 2 ): 在組件類中寫(xiě)入
using
?System.Data.OleDb;
//引用ADO.net命名空間
using
?System.Data;
//引用數(shù)據(jù)空間
using
?System.Runtime.InteropServices;
//為了調(diào)用GUID
System.EnterpriseServices命名空間包涵所有COM+的類型庫(kù)所以在編寫(xiě)COM+組件的時(shí)候一定要用到System.EnterpriseServices命名空間,這個(gè)命名空間在引用中.net頁(yè)下可以找到
using
?System.EnterpriseServices;
//引用COM+名命空間
using
?System.Runtime.CompilerServices;
//運(yùn)行時(shí)編譯服務(wù)器
using
?System.Reflection;
//用些全局屬性取得強(qiáng)名屬性
[assembly: ApplicationName( "myCom" )]
//強(qiáng)名文件名和文件屬性.用sn.exe生成,用法 sn -k mycom.snk
[assembly: AssemblyKeyFileAttribute( "mycom.snk" )]
[assembly:?
AssemblyKeyName
( "mycom.snk" )]
( 3 )組件類的寫(xiě)法
組件類的寫(xiě)法有二種一種是以前的那種
一種是基于接口編程的例如:
{
???? //每一個(gè)接口一個(gè)GUID號(hào)
??? [Guid( "549047DE-9F3B-4781-A1F6-F3C852091FC9" )]
???? //接口類型ComInterfaceType.InterfaceIsDual接示接口需要雙重公開(kāi)給COM+
???? //這個(gè)屬性是接口的屬性
??? [InterfaceType( ComInterfaceType.InterfaceIsDual )]
??? ? //定義接口
???? public ? interface ?Add
????
??? {
??????? 接口內(nèi)的方法返回布爾值有一個(gè)整型參數(shù)
???????? bool ?AddData(? int ?d );
????????
???????? bool ?AddDataM(? int ?d );
??? }
???? //實(shí)現(xiàn)這個(gè)接口
??? //事務(wù)屬性表示需要新事務(wù)
???? //這個(gè)屬性用來(lái)記錄類是否支持事務(wù)有車個(gè)選項(xiàng)同VB中類的屬性相同
??? [Transaction( TransactionOption.RequiresNew)]
???? //在類中實(shí)現(xiàn)這個(gè)接口必須要繼承System.EnterpriseServices;命名空間的ServicedComponent類
???? //在后面繼承前面所定義的接口如果有多個(gè)可以用“,”分開(kāi)
???? public ? class ?myClass:ServicedComponent,Add
??? {
???????? //? public myCom.myClass?? error =new ErrorsLibrary.Class1( );
????????
???????? //定認(rèn)字符變量用來(lái)存放數(shù)據(jù)庫(kù)連接字符串
???????? private ? static ? string ?strConnect ="Provider=MSDAORA.1;Password=erpii;User ID=erpii;Data Source=erpii;Persist Security Info=True";
???????? //創(chuàng)建這個(gè)連接
???????? private ?OleDbConnection conConnection =? new ?OleDbConnection (strConnect) ;
????????
????????
??????? ? //實(shí)現(xiàn)接口中的查詢方法
???????? public ? bool ?AddData(? int ?id )
??????? {
???????????? try
??????????? {
????????????????
??????????????? //string StrSql="insert into??? TEST1?? values('" + id + "' )";
???????????????? string ?StrSql=" insert into??? test_d? values('" + id + "',"?
??????????????? +"'" + id + "',"
??????????????? + "'" + id + "',"
??????????????? + "'" + id + "' )";
???????????????? //???? string StrSql="DELETE FROM TEST1";?
???????????????? //找開(kāi)連接
??????????????? conConnection.Open( );? // 打開(kāi)數(shù)據(jù)連接
???????????????? //執(zhí)行查詢
??????????????? OleDbCommand cmd =? new ?OleDbCommand (StrSql , conConnection) ;
??????????????? cmd.ExecuteNonQuery ( );
??????????????? conConnection.Close ( );
????????????????
??????????????? ? //ContextUtil.SetComplete( ) ;
???????????????? return ? true ;
??????????? }
???????????? catch ?( Exception e )?
??????????? {
????????????????
???????????????? //error.Description =e.Message;
???????????????? //??? EnterpriseServices.ContexUtil.
??????????????? ContextUtil.SetAbort( );
???????????????? return ? false ;
??????????????? //????
??????????? }
??????? }
????????
???????? public ? bool ?AddDataM(? int ?id )
??????? {
???????????? try
??????????? {
???????????????? //??? string StrSql="insert into??? TEST21? values(" + id + "' )";
??????????????? //??? string StrSql="DELETE FROM TEST2";?
???????????????? //找開(kāi)連接
???????????????? string ?StrSql=" insert into??? test_m? values('" + id + "',"?
??????????????? +"'" + id + "',"
??????????????? + "'" + id + "',"
??????????????? + "'" + id + "' )";
??????????????? conConnection.Open( ); // 打開(kāi)數(shù)據(jù)連接
???????????????? //執(zhí)行查詢
??????????????? OleDbCommand cmd =? new ?OleDbCommand (StrSql , conConnection) ;
??????????????? cmd.ExecuteNonQuery ( );
??????????????? conConnection.Close ( );
??????????????? //??? System.EnterpriseServices.ContextUtil.SetComplete( ) ;
???????????????? return ? true ;
????????????????
??????????? }
???????????? catch ?( Exception e )?
??????????? {
??????????????? / /error.Description =e.Message;
??????????????? //??? EnterpriseServices.ContexUtil.
??????????????? //??? System.EnterpriseServices.ContextUtil.SetAbort( );
???????????????? //??? e.Message;
??????????????? ContextUtil.SetAbort ( ) ;
???????????????? return ? false ;
????????????????
??????????? }
????????????
??????? }
????????
??????? ? //如果在方法或類上使用[AutoComplete]則事務(wù)類或方法在沒(méi)有錯(cuò)誤的情狀下自動(dòng)提交事務(wù)
??????? [AutoComplete]
???????? public ? bool ?addRs( )
??????? {
????????????
???????????? try
??????????? {
???????????????? for ?(? int ?i=0;i<100;i++ )
??????????????? {
???????????????????? ////?? ?????
???????????????????? if ?( !AddData( i ) )
??????????????????? {???? //事務(wù)回滾
??????????????????????? ContextUtil.SetAbort ( ) ;
?????? 函數(shù)返回值
???????????????????????? return ? false ;
??????????????????? }
???????????????????? //如函數(shù)不等于真則回滾其中(?┫嗟庇赩B中的(NOT)
???????????????????? if ?(!AddDataM( i ) )
????????????????????
??????????????????? {
??????????????????????? ContextUtil.SetAbort ( ) ;
???????????????????????? return ? false ;
??????????????????? }
????????????????????
??????????????? }
?????????????????? 如查成功能提交事務(wù)
??????????????? ContextUtil.SetComplete( );?
???????????????? return ?? true ;
????????????????
??????????? }
????????????
????????????
???????????? catch ?( Exception e )?
??????????? {
???????????????? //????? error.Description =e.Message;
??????????????? //??? EnterpriseServices.ContexUtil.
???????????????? //??? ContextUtil.SetAbort( );
??????????????? ContextUtil.SetAbort ( ) ;
???????????????? return ? false ;
?????????????? ?? //? ???
??????????? }
??????? }
????????
???????? public ?myClass( )
??????? {
???????????? //
??????????? // TODO: 在此處添加構(gòu)造函數(shù)邏輯
???????????? //
??????? }
??? }
}
2. 在代碼編寫(xiě)完成之后要注冊(cè)我的組件到COM+服務(wù)器上
2.1 編譯成COM+組件
-
?首先,必須為該程序集創(chuàng)建一個(gè)類型庫(kù).類型庫(kù)是 .NET 程序集中所包含的元數(shù)據(jù)的 COM 等效組件.類型庫(kù)通常包含在擴(kuò)展名為 .tlb 的文件中.類型庫(kù)包含必要信息,COM 客戶端使用這些信息可以確定在特定服務(wù)器中有哪些類,以及這些類支持的方法、屬性和事件..NET 框架 SDK 包含一個(gè)名為 tlbexp(類型庫(kù)導(dǎo)出程序)的工具,它可以從程序集創(chuàng)建類型庫(kù).tlbexp 包含許多選項(xiàng),可以在命令提示符處鍵入 tlbexp /? 查看所有選項(xiàng).其中一個(gè)是 /
out
?選項(xiàng),用于指定已生成的類型庫(kù)的名稱.(如果您不自己指定名稱,將自動(dòng)為您創(chuàng)建一個(gè)名稱.)例如,要將元數(shù)據(jù)從一個(gè)名為 MyCom.dll 的程序集提取到一個(gè)名為 MyCom.tlb 的類型庫(kù)中,可以使用以下命令行:
*注意:tlbexp MyCom.dll / out :MyCom.tlb的命令中 out :MyCom.tlb
out : 和?? MyCom.tlb?? 就是要導(dǎo)出的類型庫(kù)文件中間一定要有一個(gè)空格
tlbexp MyCom.dll / out :MyCom.tlb -
應(yīng)使用 .NET 框架 SDK 中的程序集注冊(cè)工具 ( regasm ),通過(guò)一次操作同時(shí)完成類型庫(kù)的創(chuàng)建和注冊(cè).這是在一臺(tái)計(jì)算機(jī)上同時(shí)進(jìn)行 .NET 和 COM 開(kāi)發(fā)所能使用的最簡(jiǎn)單的工具.與 tlbexp 類似,regasm 有許多選項(xiàng).在命令提示符處鍵入 regasm /?,可以查看所有選項(xiàng).要使用 regasm 創(chuàng)建并注冊(cè)一個(gè)類型庫(kù),可以使用相應(yīng)的命令行,如:
regasm /tlb:MyCom.tlb MyCom.dll
或者:設(shè)置項(xiàng)目配置里的生成屬性,為Com Interop 注冊(cè):True
2.2 注冊(cè)Com+組件
(2) 最后我們要把我們編寫(xiě)好的組件放置到COM+服務(wù)器上去
Regsvcs /c?? myCom.dll
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
