C#創建COM組件全過程

今天終於解決了C#創建COM組件並在其他環境之中正確調用,其中http://developer.51cto.com/art/200907/133668.htm對我幫助不少,現轉載出來,方便自己學習,也爲有同樣問題的同學提供參考。

    用C#創建COM組件看來是個很簡單的功能,但因爲此類文章較少,還是有很多不明白的地方需要學習。本文詳細闡述如何用C#創建COM組件,並能用VC6.0等調用。

本文詳細闡述如何用C#創建COM組件,並能用VC6.0等調用。並附有完整測試通過的代碼。該功能總體看來很簡單。可是我在第一次用C#做COM的時候,痛不欲生。因爲很少有人寫這類文章。而且就算有代碼也是亂帖。根本是讓人誤入歧途。後來在C# help上面看一個老外寫的文章 (上面有一個完整的SQL SERVER實例),才完成該功能。拿來分享。

開發工具:VS2008

VS2008命令提示符(呵呵,這個你應該可以找到在什麼地方吧)

附:本文適用任何VS系列工具。

在用C#創建COM組件時,一定要記住以下幾點:

1:所要導出的類必須爲公有;

2:所有屬性、方法也必須爲公有;

3:要導出的屬性、方法必須用接口方式;如果沒有在接口中聲明,即使該方法(屬性)爲公有,也不能正常導出到COM。但他們可以被別的.NET程序所使用;

4:所有的事件也必須用接口方式;

現在我們開始正題:

一、新建一個Visual C#工程(習慣這種叫法了,現在應該叫解決方案),選擇類型“類庫”;我就叫MyCom吧。

二、編寫導出接口。爲了大家理解方便,我僅一加法操作舉例。如下:

  1. [Guid("154BD6A6-5AB8-4d7d-A343-0A68AB79470B")]  
  2.  
  3.     public interface MyCom_Interface  
  4.  
  5.     {  
  6.  
  7.         [DispId(1)]  
  8.  
  9.         int Add(int a, int b);  
  10.  
  11.   }  

Guid爲全局唯一標識,可以用VS2008的命令提示符中輸入:guidgen 就會出來它的窗口。在幾個複選框選擇最後一個Registry Format,點擊New Guid,然後COPY就行了(以下如有guid的字符串,全部同樣操作)

[DispId(1)]爲函數的標識。如果有多個函數可相應的在函數前面加[DispId(2)], [DispId(3)]…

三、創建事件接口。

  1. [Guid("D11FEA37-AC57-4d39-9522-E49C4F9826BB"),  
  2.  
  3. InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]  
  4.  
  5. public interface MyCom_Events  
  6.  
  7. {  
  8.  
  9. }  

Guid同二,不多說

InterfaceType表求向COM公開的方式,這裏選擇爲以調度的方式向COM公開。

四、 創建具體類:

  1. [Guid("2E3C7BAD-1051-4622-9C4C-215182C6BF58"),  
  2.  
  3.       ClassInterface(ClassInterfaceType.None),  
  4.  
  5.       ComSourceInterfaces(typeof(MyCom_Events))]  
  6.  
  7.     public class Class1 : MyCom_Interface  
  8.  
  9.     {  
  10.  
  11.         public int Add(int a, int b)  
  12.  
  13.         {  
  14.  
  15.             return a + b;  
  16.  
  17.         }  
  18.  
  19.  }  

至此,代碼完畢。很簡單吧。別急,後面來有常常被忽略的步驟,先把整體代碼放在下面(注意引用InteropServices):

  1. using System;  
  2.  
  3. using System.Runtime.InteropServices;  
  4.  
  5. using System.Text;  
  6.  
  7.    
  8.  
  9. namespace MyCom  
  10.  
  11. {  
  12.  
  13.     [Guid("154BD6A6-5AB8-4d7d-A343-0A68AB79470B")]  
  14.  
  15.     public interface MyCom_Interface  
  16.  
  17.     {  
  18.  
  19.         [DispId(1)]  
  20.  
  21.         int Add(int a, int b);  
  22.  
  23.     }  
  24.  
  25.    
  26.  
  27.     [Guid("D11FEA37-AC57-4d39-9522-E49C4F9826BB"),  
  28.  
  29.     InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]  
  30.  
  31.     public interface MyCom_Events  
  32.  
  33.     {  
  34.  
  35.    
  36.  
  37.     }  
  38.  
  39.    
  40.  
  41.     [Guid("2E3C7BAD-1051-4622-9C4C-215182C6BF58"),  
  42.  
  43.       ClassInterface(ClassInterfaceType.None),  
  44.  
  45.       ComSourceInterfaces(typeof(MyCom_Events))]  
  46.  
  47.     public class Class1 : MyCom_Interface  
  48.  
  49.     {  
  50.  
  51.         public int Add(int a, int b)  
  52.  
  53.         {  
  54.  
  55.             return a + b;  
  56.  
  57.         }  
  58.  
  59.     }  
  60.  
  61. }  

五、大家都知道COM是需要註冊的。註冊時要加密鑰文件.SNK。這一部就是生成SNK文件。進入VS2008命令提示符。用命令:sn –k MyCom.snk回車。我的在E:\vs2008\vc下面就生成了一個(MyCom.snk)的文件。(你們可以根據自己的命令提示符所在的文件目錄下去找)。然後把它COPY到你的工程根目錄下。

六、打開AssemblyInfo.cs。在裏面加入[assembly:AssemblyKeyFile("MyCom.snk")]

七、(1)項目屬性->應用程序->程序集信息->選中“使程序集COM可見”。(2)項目屬性->生成->選中“爲COM互操作註冊”。

八、生成。如果在Debug下有一個MyCom.tlb,那你就成功了(肯定還有MyCom.dll)要此tlb文件是爲了在VC6.0裏面測試。

九、在VC裏面建一個MFC對話框程序(當然Console程序也一樣,我爲了看着方便)。建好後,把剛剛生成的MyCom.tlb拷到你的根目錄下。

十、選在代碼里加入#import "MyCom.tlb",然後編寫核心測試代碼:(我是在一個Button1按鈕裏面添加的),如下:

  1. void CTestDlg::OnButton1()   
  2. {  
  3.     CoInitialize(NULL);  //注意初始化  
  4.     MyCom::MyCom_InterfacePtr p(__uuidof(MyCom::Class1));  //創建智能指針  
  5.     MyCom::MyCom_Interface *s = p;  
  6.     int a = 3;  
  7.     int b = 6;  
  8.     int c = s->Add(a,b);  
  9.     CString str;  
  10.     str.Format("%d",c);  
  11.     MessageBox(str);  

當彈出一個9,就說明你已經成功用C#創建COM組件了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章