C# 寫COM組件以及組件的調用(Visual Studio 2010)

1. 新建lib

Figure1

2. 將Class1.cs改爲我們想要的名字(例如:MyClass.cs)

Figure2Figure3

問是否同時給類改名,確定

Figure4

3. 修改Properties目錄下面的AssemblyInfo.cs

Figure5

ComVisible屬性設置爲true 

原來默認值:

Figure6

改成如下:

Figure

4. 項目->MyLib屬性

切換到“生成”選項卡,在底部位置,勾選“爲COM互操作註冊”,編譯的時候就會輸出COM 組件對應的tlb文件(VC++調用COM使用),並在編譯的時候註冊COM組件。

Figure8

5. 需要進行簽名,則需要public key和private key,不是必要步驟,不做介紹,當然如果使用了snk文件,則在註冊之前需要先通過gacutil /i ArwenAddCom.dll 將dll放入GAC中

6. 寫code,創建接口,實現接口,代碼如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
 
namespace MyLib
{
    [ComVisible(true)]
    [Guid("35A5CE1E-551C-41EC-81D4-005318550119")]
    public interface IMyClass
    {
        void Initialize();
        void Dispose();
        int Add(int x, int y);
    }
    [ComVisible(true)]
    [Guid("F0239BF9-0A6E-49A6-8853-BADE1B95E66F")]
    [ProgId("MyLib.MyClass")]
    public class MyClass : IMyClass
    {
        public void Initialize()
        {
            // nothing to do
        }
 
        public void Dispose()
        {
            // nothing to do
        }
 
        public int Add(int x, int y)
        {
            return x + y;
        }
    }
}

7. GUID屬性裏面的那個字符串,在“工具”菜單下面,“創建 GUID”。作爲COM組件和接口的GUID

8. 編譯和註冊

編譯:生成->生成解決方案(F6)。如果沒有生成.tlb文件,需要用管理員身份打開Visual Studio 2010,然後重新編譯

註冊:在start=》all program裏面找到visual studio 命令提示符,以管理員身份運行,

Figure 11

在命令提示符下面,進入Dll所在的目錄

C:\Windows\system32>cd/d E:\MyLib\MyLib\bin\Debug

如果使用了SNK進行簽名的話,要先利用命令 gacutil /i MyLib.dll 將這個DLL加入的全局緩存裏

E:\MyLib\MyLib\bin\Debug>gacutil/i mylib.dll

然後用 regasm MyLib.dll 註冊這個dll

E:\MyLib\MyLib\bin\Debug>regasm mylib.dll
 

Figure 12

9. 使用COM組件

至於C#調用COM組件很簡單,在註冊COM組件之後,就可以添加reference,然後在COM列表裏找到該dll.

VC++ 調用C# COM組件,也比較簡單,只不過因爲是利用COM組件編譯出來的tlb文件(其實VC++寫的COM組件也會編譯出該文件,只不過一般不使用),沒有.h和.c文件,所以特別注意一下。

a.引用tlb文件

在需要COM組件的文件裏面,添加 #import "mylib.tlb" rename_namespace("namespace"),編譯器

b.由於用的tlb文件,在使用的時候,返回值不一定是HRESULT,如果是在接口函數裏面設置了返回值,則類型就是返回值的類型,如果沒有返回值,就是HRESULT.

 

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