C# 写COM组件以及组件的调用(Visual Studio 2010)

1. 新建lib

C# 写COM组件以及组件的调用(Visual Studio 2010)_第1张图片

2. 将Class1.cs改为我们想要的名字(例如:MyClass.cs)

C# 写COM组件以及组件的调用(Visual Studio 2010)_第2张图片C# 写COM组件以及组件的调用(Visual Studio 2010)_第3张图片

问是否同时给类改名,确定

C# 写COM组件以及组件的调用(Visual Studio 2010)_第4张图片

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

C# 写COM组件以及组件的调用(Visual Studio 2010)_第5张图片

ComVisible属性设置为true 

原来默认值:

Figure6

改成如下:

Figure

4. 项目->MyLib属性

切换到“生成”选项卡,在底部位置,勾选“为COM互操作注册”,编译的时候就会输出COM 组件对应的tlb文件(VC++调用COM使用),并在编译的时候注册COM组件。

C# 写COM组件以及组件的调用(Visual Studio 2010)_第6张图片

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 命令提示符,以管理员身份运行,

C# 写COM组件以及组件的调用(Visual Studio 2010)_第7张图片

在命令提示符下面,进入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
 

C# 写COM组件以及组件的调用(Visual Studio 2010)_第8张图片

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.

 

你可能感兴趣的:(COM学习)