软件集成接口.COM组件交互(2)

本文介绍如何使用C#创建COM组件,并详细展示了从定义接口、事件到实现类的全过程。文章通过实例解释了如何使C#类库对外界可见并能被其他语言调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >




如果没有必要,我是真的不想在C#中玩COM组件,原因很多,其中一条是它的效率不高。


C#调用COM组件是很简单的事情,但C#中似乎不能直接引用C#写的COM组件(这可能真叫脱了裤子放屁)。

C#写的COM组件,绝大多数情况是给“旧时代的语言”用的,很不幸,我经常接触到这种“旧时代的语言”。


过程:

1.新建一个C#的类库工程(我没试过用C#生成EXE的COM服务)


2.写一个接口,定义COM组件对象方法:

    [ComVisible(true)]
    [Guid("44E5D2FC-8E64-4b13-8600-EF87F2669FB2")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface IStartAction
    {
        [DispId(8184)]
        void doSomething(ref String data);

        [DispId(8180)]
        Object OnWriteback { get; set; }
    }

说明:

1)如果需要对调用者可见,那么就需要加上[ComVisible(true)],但我不建议全局定义它(AssemblyInfo.cs)

2)GUID用VS中的工具生成

3)DispId可以自己随便写,但在C++响应COM事件的时候,可能会用到

4)OnWriteback是一个属性,主要用于接收VBS中的GetRef,因为VBS中某些情况下无法使用连接点来响应COM事件


3.再写一个接口,定义COM组件事件:


    [ComVisible(true)]
    [Guid("8D1B96E5-73A3-4d23-A940-B36327790B7B")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IStartEvents
    {
        [DispId(8180)]
        void doBackevent(ref String data);
    }

    public delegate void StartHandler(ref String data);


4.写一个类,实现COM组件对象


    [ComVisible(true)]
    [Guid("08E5B21E-4389-47ab-990B-109F57C8FBF7")]
    [ClassInterface(ClassInterfaceType.None)]
    [ComDefaultInterface(typeof(IStartAction))]
    [ComSourceInterfaces(typeof(IStartEvents))]
    public class Start : IStartAction
    {
        #region IStartAction 成员

        public void doSomething(ref String data)
        {

        }

        private Object onWriteback = null;
        public Object OnWriteback { get { return (onWriteback); } set { onWriteback = value; } }

        #endregion

        #region IStartEvents 事件

        public event StartHandler doBackevent;
        public void doWriteback(ref String data)
        {
            if (null != doBackevent)
            {
                doBackevent(ref data);
            }
            if (null != onWriteback)
            {
                onWriteback.GetType().InvokeMember("", BindingFlags.InvokeMethod, null, onWriteback, new Object[] { data });
            }
        }

        #endregion

        #region IStartAction 测试

        private void doTeststart(ref String data)
        {
            System.Windows.Forms.MessageBox.Show("data:" + data);
            doWriteback(ref data);
            System.Windows.Forms.MessageBox.Show("back:" + data);
        }

        #endregion
    }

编译好之后,生成DLL,就是一个COM组件了。注意使用RegAsm注册的时候,要加/tlb参数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值