1. 新建lib
2. 將Class1.cs改爲我們想要的名字(例如:MyClass.cs)
問是否同時給類改名,確定
3. 修改Properties目錄下面的AssemblyInfo.cs
ComVisible屬性設置爲true
原來默認值:
改成如下:
4. 項目->MyLib屬性
切換到“生成”選項卡,在底部位置,勾選“爲COM互操作註冊”,編譯的時候就會輸出COM 組件對應的tlb文件(VC++調用COM使用),並在編譯的時候註冊COM組件。
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 命令提示符,以管理員身份運行,
在命令提示符下面,進入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
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.