說明:
我是一個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,言歸正傳.
主要內容:
本著易於使用的目的,我把Northwind導入到了SQLServer,然後測試了我的代碼.(the sake of simplycity這個不知道啥意思,難道是由於出現紙尿布....).
Part I: 用C#創建一個簡單的COM組件
COM對象是一種類庫.COM組件將產生DLL文件.在VS環境裡面創建COM組件請選擇....
File->New->Project->VisualC# Projects ->Class Library.
創建一個名為Database_COMObject的類庫工程.
請記住:想要把C#對象當作COM對象需要以下幾點...
未在接口中定義的成員,而在實現裡面是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)]