C#創建COM組件


本文詳細闡述如何用C#創建COM組件,並能用VC6.0等調用。

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

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

1。所要導出的類必須為公有;

2。所有屬性、方法也必須為公有;

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

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

現在開始正題:

一、新建一個Visual C#工程(習慣這種叫法了,現在應該叫解決方案),

選擇類型“類庫”;就叫MyCom吧。

二、編寫導出接口。

為了大家理解方便,僅以一加法操作舉例。如下:

 

[Guid("154BD6A6-5AB8-4d7d-A343-0A68AB79470B")]
public interface MyCom_Interface
{
    [DispId(1)]
    int Add(int a, int b);
}  

  

Guid為全局唯一標識,可以用VS2008的命令提示符中輸入:用guidgen工具(系統自帶)可以產生guid,在幾個復選框選擇最后一個Registry Format,點擊New Guid,然后COPY就行了(以下如有guid的字符串,可用同樣操作產生)

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

三、創建事件接口。

 

[Guid("D11FEA37-AC57-4d39-9522-E49C4F9826BB"),  
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface MyCom_Events
{
}  

  

Guid同二,不多說

InterfaceType表示向COM公開的方式,這里選擇為以調度的方式向COM公開。

四、 創建具體類:

 

[Guid("2E3C7BAD-1051-4622-9C4C-215182C6BF58"), 
 ClassInterface(ClassInterfaceType.None), 
 ComSourceInterfaces(typeof(MyCom_Events))]
public class Class1 : MyCom_Interface
{
    public int Add(int a, int b)
   {
       return a + b;
   }
}

  


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

using System;  
using System.Runtime.InteropServices;  
using System.Text;  
namespace MyCom  
{
    [Guid("154BD6A6-5AB8-4d7d-A343-0A68AB79470B")]
    public interface MyCom_Interface
   {
       [DispId(1)]
       int Add(int a, int b);
   }

    [Guid("D11FEA37-AC57-4d39-9522-E49C4F9826BB"),InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface MyCom_Events
   {
   }

    [Guid("2E3C7BAD-1051-4622-9C4C-215182C6BF58"), ClassInterface(ClassInterfaceType.None),ComSourceInterfaces(typeof(MyCom_Events))]
    public class Class1 : MyCom_Interface
   {
        public int Add(int a, int b)
       {
            return a + b;
       }
   }
}  

  

五、大家都知道COM是需要注冊的。注冊時要加密鑰文件.SNK。

自動生成:項目屬性->簽名(signing)->程序集簽名(Sign the assembly)。選擇創建,文件名為MyCom,密碼項不勾選。生成后在AssemblyInfo.cs文件中添加了[assembly:AssemblyKeyFile("MyCom.snk")]

手動添加:這一部就是生成SNK文件。進入VS2008命令提示符。用命令:sn –k MyCom.snk回車。我的在E:\vs2008\vc下面就生成了一個(MyCom.snk)的文件。(你們可以根據自己的命令提示符所在的文件目錄下去找)。然后把它COPY到你的工程根目錄下。打開AssemblyInfo.cs。在里面加入[assembly:AssemblyKeyFile("MyCom.snk")]

六、設置項目為com

(1)項目屬性->應用程序->程序集信息->選中“使程序集COM可見”(英文版 - Make assembly Com-Visible )。
(2)項目屬性->生成->選中“為COM互操作注冊”(英文版 - Register for COM interop)。

八、生成。

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

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

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

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

  

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

程序員的基礎教程:菜鳥程序員


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM