c#制作ActiveX控件

使用VS2010制作ActiveX控件

工具/原料

  • 一台windows操作平台的电脑
  • VS2010工具

方法/步骤

  • 新建一个项目,选window->类库(这里选控件库也是可以的)

c#制作ActiveX控件

  • 在应用程序->程序集信息,勾选里面的“使程序集com可见”

c#制作ActiveX控件

  • 然后在生成->勾选“为com互操作注册”然后重新生成解决方案

c#制作ActiveX控件

  • 在AssemblyInfo.cs类里面添加一下内容

c#制作ActiveX控件

  • 然后添加接口IObjectSafety.cs,这里的名字不要改它

c#制作ActiveX控件

  • 接口里面的内容如下,特别注意的是这里面的guid 不能更改,只要将下面的代码复制到接口里面去就可以了

        [ComImport, GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]

        [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]

        interface IObjectSafety

        {

            [PreserveSig]

            int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions);

            [PreserveSig()]

            int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);

        }

c#制作ActiveX控件

  • 添加用户控件,然后在里面拉一个label控件,textbox控件,button控件,然后给button1添加一个点击事件

private void button1_Click(object sender, EventArgs e)

{

      label1.Text = textBox1.Text;

}

c#制作ActiveX控件

c#制作ActiveX控件

  • 这里是生成guid,工具->创建guid,点击右边的复制就可以了

c#制作ActiveX控件

c#制作ActiveX控件

  • 将刚才生成的guid添加到用户控件上面去,并且让用户控件继承接口IObjectSafety,并且在用户控件里面实现接口IObjectSafety,将下面的复制粘贴就可以了

#region IObjectSafety 成员

        private const string _IID_IDispatch = "{00020400-0000-0000-C000-000000000046}";

        private const string _IID_IDispatchEx = "{a6ef9860-c720-11d0-9337-00a0c90dcaa9}";

        private const string _IID_IPersistStorage = "{0000010A-0000-0000-C000-000000000046}";

        private const string _IID_IPersistStream = "{00000109-0000-0000-C000-000000000046}";

        private const string _IID_IPersistPropertyBag = "{37D84F60-42CB-11CE-8135-00AA004BB851}";

        private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;

        private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;

        private const int S_OK = 0;

        private const int E_FAIL = unchecked((int)0x80004005);

        private const int E_NOINTERFACE = unchecked((int)0x80004002);

        private bool _fSafeForScripting = true;

        private bool _fSafeForInitializing = true;

        public int GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions)

        {

            int Rslt = E_FAIL;

            string strGUID = riid.ToString("B");

            pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;

            switch (strGUID)

            {

                case _IID_IDispatch:

                case _IID_IDispatchEx:

                    Rslt = S_OK;

                    pdwEnabledOptions = 0;

                    if (_fSafeForScripting == true)

                        pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;

                    break;

                case _IID_IPersistStorage:

                case _IID_IPersistStream:

                case _IID_IPersistPropertyBag:

                    Rslt = S_OK;

                    pdwEnabledOptions = 0;

                    if (_fSafeForInitializing == true)

                        pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;

                    break;

                default:

                    Rslt = E_NOINTERFACE;

                    break;

            }

            return Rslt;

        }

        public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions)

        {

            int Rslt = E_FAIL;

            string strGUID = riid.ToString("B");

            switch (strGUID)

            {

                case _IID_IDispatch:

                case _IID_IDispatchEx:

                    if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) && (_fSafeForScripting == true))

                        Rslt = S_OK;

                    break;

                case _IID_IPersistStorage:

                case _IID_IPersistStream:

                case _IID_IPersistPropertyBag:

                    if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_DATA) && (_fSafeForInitializing == true))

                        Rslt = S_OK;

                    break;

                default:

                    Rslt = E_NOINTERFACE;

                    break;

            }

            return Rslt;

        }

        #endregion

c#制作ActiveX控件

 

  • 然后添加一个安装部署项目,然后添加项目输出,将刚刚的项目选上就可以了

c#制作ActiveX控件

c#制作ActiveX控件

c#制作ActiveX控件

c#制作ActiveX控件

  • 然后右键部署项目,生成之后在项目下的debug文件夹下有两个文件分别为exe和msi文件,双击msi文件按照安装步骤安装。
  • 然后在解决方案里面再添加一个项目。主要是用来测试的,这里我选择的页面来测试,然后在Default.aspx里面添加一个object,里面的classid为刚刚给用户控件添加的guid,一定要相同的,不然的话 系统找不到你制作的控件,然后将项目设为启动项目,运行就可以了

c#制作ActiveX控件

c#制作ActiveX控件

c#制作ActiveX控件

注意:

  • IObjectSafety.cs接口的guid一定不能变,这个是一个固定值
  • 页面的guid一定要和控件上的guid一样
  • 如果你制作的ActiveX控件需要添加信任站点之后才可以看到的话,一是你没有让你的控件继承接口IObjectSafety.cs,二就是你改了接口上的guid值
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值