用C#开发COM组件

什么是ActiveX?

一组符合COM规范的工具,让开发人员使用新的或已有的工具把计算机桌面环境与www集成起来。

 

什么是OCX?

ActiveX控制(OCX)是微软媒体运动的定义技术,这些控制使开发人员能够以无缝的方式通过www为最终用户提交完整的应用。

 

面向对象的优缺点

面向对象解决了程序的向后兼容性,操作系统依赖性。OOP的接口是给外部函数调用的,私有函数只能够自己使用,外部无法访问,这就是封装性。当一个类继承另一个类时,它具有父类的接口,方法和字段,子类也能拓展新的方法。当不同的对象具有相同的接口时,它们就是多态的,这意味着开发人员可以开发通用的接口。

 

为什么要为COM组件声明一个GUID?HTML的object标签的classid属性里的CLSID为什么正好与COM对象的GUID对应

GUID标识一个对象的类标识或CLSID;或代表组件内的一个接口标识的IID。

为了让COM把GUID和含有对象的实际文件关联起来,应该使用注册表。

 

如何用C#开发一个COM组件?

请记住:想要把C#对象当作COM对象需要以下几点...

  • class必须是public的
  • 属性,方法和事件必须是public
  • 属性和方法必须在Interface里面定义
  • 事件必须在事件的接口中

未在接口中定义的成员,而在实现里面是public的成员,对COM是不可见的,但是对其他的.NET程序是可见的.为了把属性和方法暴露给COM,你必须在接口中定义他们,并且把他们用DispId属性标记.暴露给COM的那些属性方法其实就在类的实现里面.他们必须被标记为public每一个接口都要有一个GUID属性

在编译前,我们还需要在项目里设置一下:属性->应用程序->程序集信息 里勾选使程序集COM可见

来看下连接数据库的例子:

暴露的接口:

[Guid("694C1820-04B6-4988-928F-FD858B95C880")]

public interface DBCOM_Interface

{

    [DispId(1)]

    void Init(string userid , string password);

}

实现类:

[Guid("9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E"),

    ClassInterface(ClassInterfaceType.None),

    ComSourceInterfaces(typeof(DBCOM_Events))]

    public class DBCOM_Class : DBCOM_Interface

    {

        private SqlConnection myConnection = null ;

        SqlDataReader myReader = null ;



        public DBCOM_Class()

        {

        }



        public void Init(string userid , string password)

        {

            try

            {

                string myConnectString = "user id="+userid+";password="+password+

                    ";Database=NorthWind;Server=SKYWALKER;Connect Timeout=30";

                myConnection = new SqlConnection(myConnectString);

                myConnection.Open();

                //MessageBox.Show("CONNECTED");



            }

            catch(Exception e)

            {

                MessageBox.Show(e.Message);

            }

        }

    }

}

解释一下:ClassInterfaceType.None表示,这个类不会产生类接口.如果没有显式的接口实现,那么这个类只能提供对IDispatch的访问.用户期待通过接口导出该类显式实现了的成员.所以需要使用设置ClassInterfaceAttribute.

 

ComSourceInterfaces(typeof(DBCOM_Events))]标明标记的这个类会把接口暴露给COM事件源.在我们的例子中,没有什么需要暴露的..

 

转载自:[翻译]用C#写COM组件,《ActiveX开发人员指南》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值