透過C#實作COM服務

透過.NET也可以實作COM服務,下面就用範例來帶各位了解一下,但這只是一個簡單的測試。

透過.NET也可以實作COM服務,下面就用範例來帶各位了解一下,但這只是一個簡單的測試。

 1.建立DLL專案

  •   開始程式集Microsoft Visual Studio 2008啟動Visual Studio 2008主程式
  •   按下檔案並新增專案選擇Visual C#的類別庫,如下圖1
圖1 新增DLL專案
 
  • 輸入專案名稱,例如MyFirstCom,按下確定紐之後就會產生專案

2.加入參考

  •   在MyFirstCom專案的參考按下右件加入參考找到System.EnterpriseServices並加入,如下圖2
圖2 加入System.EnterpriseServices組件
 

在這邊我們先將組件加入到專案內,因為等下寫程式需要用到此組件。 3.程式碼實作與說明 Step 1:建立簽署檔案(key.snk)此步驟是用來建立專案的簽署檔,這是為了確保專案的DLL檔是唯一的,當透過regsvcs(會在佈署方式說明)來註冊COM服務時,會根據簽署檔產生為一的CLSID(每個COM服務都會有的唯一識別碼)。

  • 在MyFirstCom的專案按下右鍵選擇屬性在開啟的設定畫面點選「簽署」頁籤,如下圖3:
圖3 MyFirstCom專案設定畫面
 
  • 將「簽署組件」打勾並在「選擇強是名稱金鑰檔」下拉點選新增「金鑰檔案名稱」輸入key.snk(將保戶密碼的核選方塊取消掉),如下圖4:
圖4 建立專案組件金鑰檔
  •  這時候就會在方案總管出現key.snk的檔案

Step 2:修改AssemblyInfo.cs檔案此檔案主要是用來設定組件的屬性(Attribute),透過[assembly:屬性名稱]來標示組件具有哪些狀態或是數值,當然組件的屬性設定也是可以在其它的cs程式檔裡面設定,只是一般會統一在這檔案設定。

  •   展開MyFirstCom專案的Properties,開啟AssemblyInfo.cs檔案
  •   將下面的程式碼加入到AssemblyInfo.cs的檔案

Step 3:加入程式碼到HelloCom.cs(可以自行刪掉Class1.cs或是直接使用)若透過.Net來建立COM服務,在程式碼的撰寫上大概有幾個步驟:

  • 建立IHelloCom介面,裡面定義的方法就是之後的COM服務。
  • HelloCom類別需繼承ServicedComponent,並且實作剛剛所建立的IHelloCom介面。
  • 透過 Visual Studio 2008的工具建立GUID建立兩組GUID。這是用指定註冊後的COM所代表的唯一識別值,分別會用來設定在HelloCom以及IHelloCom,並透過[Guid(“xxx”)]屬性來設定。
  • 在IHelloCom介面上加上[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]。代表此介面會透過IDispatch的介面來公開給COM伺服器,所以之後的客戶端只能透過late binding(晚期綁繫)的方式來呼叫,也可以使用ComInterfaceType.InterfaceIsDual來允許 Client端透過早期或晚期綁繫的方式呼叫。
  • 在HelloCom上面加上[ClassInterface(ClassInterfaceType.None)]。
  • 在IHelloCom介面上加入TestComServer方法,此方法就是註冊後會提供給客戶端程式呼叫。
  • HelloCom必須要有無參數的建構子,並實作TestComServer的方法

完整程式碼如下:

Step 4:建置專案

  • 建置是選擇Release,之後會再bin裡面的Release資料夾下產生MyFirstCom.dll

4 佈署方式

基本上透過C++所寫的COM,佈署是可以透過執行程式來安裝註冊,不過需要時做一些對應的函式,當啟動程式時,就會去執行對應的安裝函式以及註冊函式,不過在.Net的佈署上有一些不同,下面是佈署的過程: Step 1:開啟VS 2008的命令元提示 Step 2:將路徑切換到MyFirstCom專案的路徑下(具有key.snk檔案的路徑) Step 3:輸入sn –k key.snk(這是用來將專案的組件強制簽署,並確保強行別而不會發生重複的狀況)

圖5 簽署組件
 

Step 4:接著將路徑切換到底下的\bin\Release下,並輸入gacutil /-i MyFirstCom.dll。此指令會將MyFirstCom組件註冊到GAC(Global assembly cache)變成全域的組件,這是為了能夠讓它之後可已註冊成COM服務,如下圖6:

圖6 將組件註冊到GAC
 

Step 5:將組件註冊成COM服務輸入:regsvcs MyFirstCom.dll

圖7 註冊成COM服務