程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 用C#寫COM組件

用C#寫COM組件

編輯:C#入門知識

說明:

我是一個C#程序員,但是有一次一個需求只能用C/C++去寫,恰好需要讀取的數據存放在DB(SQL CE v3)裡面,而我又不會C/C++(關鍵是用OleDB訪問DB,這個實在是繁瑣),所以催生了用C#寫一個COM組件,用C/C++去調用的想法.可謂,很傻很天真.但是也是一種思路,如果MS提供C API的話,問題就簡單多了.可是事實是,MS自己的.NET CF用著C API,給用戶卻暴露著COM API.....OK,言歸正傳.

 

主要內容:

  • 用C#創建一個簡單的COM組件(通過COM Interop)
  • 用VC++寫一個客戶端去訪問COM組件.客戶端用TLB文件.

本著易於使用的目的,我把Northwind導入到了SQLServer,然後測試了我的代碼.(the sake of simplycity這個不知道啥意思,難道是由於出現紙尿布....).

  • 修改COM組件裡面的機器名為你的SQL Server的機器名.(2005以上需要 機器名實例名)
  • 當然我在裡面也創建了一個用戶scott密碼是tiger,用來連接數據庫.你可以選擇這個用戶名,或者重新建一個.

Part I: 用C#創建一個簡單的COM組件

COM對象是一種類庫.COM組件將產生DLL文件.在VS環境裡面創建COM組件請選擇....

  File->New->Project->VisualC# Projects ->Class Library.

創建一個名為Database_COMObject的類庫工程.

請記住:想要把C#對象當作COM對象需要以下幾點...

  • class必須是public的
  • 屬性,方法和事件必須是public
  • 屬性和方法必須在Interface裡面定義
  • 事件必須在事件的接口中

未在接口中定義的成員,而在實現裡面是public的成員,對COM是不可見的,但是對其他的.NET程序是可見的.為了把屬性和方法暴露給COM,你必須在接口中定義他們,並且把他們用DispId屬性標記,在class裡面實現(.....).在接口裡面定義的成員只是為了使用vtable(虛函數表).要想暴露事件,你也必須把成員定義在事件接口裡面並且標記DispId屬性.類不需要實現此接口(???).類可以實現接口(一個類可以實現多個接口,只有第一個接口才是默認的接口.).暴露給COM的那些屬性方法其實就在類的實現裡面.他們必須被標記為public,而且要符合接口裡面的定義.Also, declare the events raised by the class here. They must be marked public and must match the declarations in the events interface. (這兩句不知道具體的含義,代碼裡面也沒看出端倪.)

每一個接口都要有一個GUID屬性(我當時上學的時候,把他叫屬性屬性,或者定制屬性,現在也不清楚到底叫什麼..).你可以用guidgen.exe來產生一個GUID值.

這個接口就長這個樣子:

 

show sourceview source print? [Guid("694C1820-04B6-4988-928F-FD858B95C880")] public interface DBCOM_Interface {     [DispId(1)]     void Init(string userid , string password);     [DispId(2)]     bool ExecuteSelectCommand(string selCommand);     [DispId(3)]     bool NextRow();     [DispId(4)]     void ExecuteNonSelectCommand(string insCommand);     [DispId(5)]

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved