Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5174865
  • 博文数量: 1696
  • 博客积分: 10870
  • 博客等级: 上将
  • 技术积分: 18357
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-30 15:16
文章分类
文章存档

2017年(1)

2016年(1)

2015年(1)

2013年(1)

2012年(43)

2011年(17)

2010年(828)

2009年(568)

2008年(185)

2007年(51)

分类: 嵌入式

2010-09-19 19:51:32

使用C#写的第一个COM组件,并使用C#语言调用之


作者:金鸽

欢迎访问 sinodragon21.cublog.cn


在用C#创建COM组件时,一定要记住以下几点:

1:所要导出的类必须为公有;

2:所有属性、方法也必须为公有;

3:要导出的属性、方法必须用接口方式;如果没有在接口中声明,即使该方法(属性)为公有,也不能正常导出到COM。但他们可以被别的.NET程序所使用;

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

编写COM组件,生成HelloWorld.dll

// Compile: Csc.exe /out:HelloWorld.dll /target:library CHelloWorld.cs

// Author: sinodragon21

// Date: 2010/9/19
using System;
using System.Runtime.InteropServices;

namespace HelloWorld
{
    [Guid("28BA1E34-9433-4014-A87E-F6D01370F635")]
    public interface HelloWorldInterface
    {
        [DispId(1)]
        void sayHello(string str);
    }

    [Guid("D8035EF2-EE2A-44cb-900A-5CF51E85FCE8"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface HelloWorldEvents
    {
     
    }

    [Guid("2E3C7BAD-1051-4622-9C4C-215182C6BF58"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(HelloWorldEvents))]
    public class CHelloWorld:HelloWorldInterface
    {
        public void sayHello(string str)
        {
            Console.WriteLine("You said: {0}", str);
        }
    }
}


使用刚刚生成的COM组件HelloWorld.dll,调用接口前,可使用ilasm.exe工具查看COM组件的内部结构,对外提供的借口等等。

// Compile: csc /r:HelloWorld.dll test.cs

// Author: sinodragon21

// Date: 2010/9/19

using System;
using HelloWorld;

namespace testHelloWorld
{
    class testHelloWorld
    {
        static void Main(string[] args)
        {
            CHelloWorld hw = new CHelloWorld();
            hw.sayHello("I'm Kim. How do you do?");
        }
    }
}


备注:

Guid为全局唯一标识,可以用VS2008的命令提示符中输入:guidgen 就会出来它的窗口。在几个复选框选择最后一个Registry Format,点击New Guid,然后COPY就行了(以下如有guid的字符串,全部同样操作)

[DispId(1)]为函数的标识。如果有多个函数可相应的在函数前面加[DispId(2)], [DispId(3)]…

阅读(1606) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~