C# 制作ActiveX控件并添加到网页

1.创建ActiveX控件——按钮

2.定义一个接口,并在控件中实现

3.部署安装

4.CAB打包

5.添加到网页中进行测试

一.
创建ActiveX控件——按钮

1.新建一个Window窗体控件库项目,命名为ActiveXDemo.

2.在自动生成的UserControl1页面上添加一个button

3.点击事件里我们只弹出一个MesageBox

[csharp] view plain copy

  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3. MessageBox.Show("Active is working now!");
  4. }

4.在右边解决方案资源管理器的ActiveXDemo项目上右键→属性→应用程序→程序集信息→使程序集COM可见(M)。再切换到“生成”标签→勾选“为COM互操作注册”。

5.打开Properties里面的AssemblyInof.cs文件,添加如下代码:

6.为控件创建GUID:工具→创建GUID,选5,点击复制

7.打开UserControl1.cs,在public partial class UserControl1 : UserControl上面粘贴上一步生成的GUID,并添加using System.Runtime.InteropServices;

代码如下:

[csharp] view plain copy

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Data;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using System.Runtime.InteropServices;
  11. namespace ActiveXDemo
  12. {
  13. [Guid("73D3BE6A-E3B3-46F7-AFFE-8673390DA3F6")]
  14. public partial class UserControl1: UserControl
  15. {
  16. public UserControl1()
  17. {
  18. InitializeComponent();
  19. }
  20. private void button1_Click(object sender, EventArgs e)
  21. {
  22. MessageBox.Show("ActiveX is working now!");
  23. }
  24. }
  25. }

二、定义一个接口,并在控件中实现

创建一个IObjectSafety接口,让ActiveX 控件获取客户端的信任。

1.右键ActiveXDemo项目—>添加—>新建项→Visual C#项→接口

注意接口内容是固定的不要修改!!!也就是说你直接复制粘贴就可以用了,不要管里面的序列号,跟上面生成的GUID不是一回事。

[csharp] view plain copy

  1. using System;
  2. using System.Runtime.InteropServices;
  3. namespace ActiveXDemo
  4. {
  5. [ComImport, GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
  6. [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
  7. public interface IObjectSafety
  8. {
  9. [PreserveSig]
  10. int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions);
  11. [PreserveSig()]
  12. int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);
  13. }
  14. }

2.在UserControl1控件的后台代码UserControl1.cs中实现这个接口,代码如下:

[csharp] view plain copy

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Data;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using System.Runtime.InteropServices;
  11. namespace ActiveXDemo
  12. {
  13. [Guid("73D3BE6A-E3B3-46F7-AFFE-8673390DA3F6"), ProgId("ActiveXDemo.UserControl1"), ComVisible(true)]
  14. public partial class UserControl1 : UserControl, IObjectSafety
  15. {
  16. #region IObjectSafety 成员 格式固定
  17. private const string _IID_IDispatch = "{00020400-0000-0000-C000-000000000046}";
  18. private const string _IID_IDispatchEx = "{a6ef9860-c720-11d0-9337-00a0c90dcaa9}";
  19. private const string _IID_IPersistStorage = "{0000010A-0000-0000-C000-000000000046}";
  20. private const string _IID_IPersistStream = "{00000109-0000-0000-C000-000000000046}";
  21. private const string _IID_IPersistPropertyBag = "{37D84F60-42CB-11CE-8135-00AA004BB851}";
  22. private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;
  23. private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;
  24. private const int S_OK = 0;
  25. private const int E_FAIL = unchecked((int)0x80004005);
  26. private const int E_NOINTERFACE = unchecked((int)0x80004002);
  27. private bool _fSafeForScripting = true;
  28. private bool _fSafeForInitializing = true;
  29. public int GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions)
  30. {
  31. int Rslt = E_FAIL;
  32. string strGUID = riid.ToString("B");
  33. pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
  34. switch (strGUID)
  35. {
  36. case _IID_IDispatch:
  37. case _IID_IDispatchEx:
  38. Rslt = S_OK;
  39. pdwEnabledOptions = 0;
  40. if (_fSafeForScripting == true)
  41. pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
  42. break;
  43. case _IID_IPersistStorage:
  44. case _IID_IPersistStream:
  45. case _IID_IPersistPropertyBag:
  46. Rslt = S_OK;
  47. pdwEnabledOptions = 0;
  48. if (_fSafeForInitializing == true)
  49. pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;
  50. break;
  51. default:
  52. Rslt = E_NOINTERFACE;
  53. break;
  54. }
  55. return Rslt;
  56. }
  57. public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions)
  58. {
  59. int Rslt = E_FAIL;
  60. string strGUID = riid.ToString("B");
  61. switch (strGUID)
  62. {
  63. case _IID_IDispatch:
  64. case _IID_IDispatchEx:
  65. if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) && (_fSafeForScripting == true))
  66. Rslt = S_OK;
  67. break;
  68. case _IID_IPersistStorage:
  69. case _IID_IPersistStream:
  70. case _IID_IPersistPropertyBag:
  71. if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_DATA) && (_fSafeForInitializing == true))
  72. Rslt = S_OK;
  73. break;
  74. default:
  75. Rslt = E_NOINTERFACE;
  76. break;
  77. }
  78. return Rslt;
  79. }
  80. #endregion
  81. public UserControl1()
  82. {
  83. InitializeComponent();
  84. }
  85. private void button1_Click(object sender, EventArgs e)
  86. {
  87. MessageBox.Show("ActiveX is working now!");
  88. }
  89. }
  90. }

注意

[csharp] view plain copy

  1. [Guid("73D3BE6A-E3B3-46F7-AFFE-8673390DA3F6")]

变成了

[csharp] view plain copy

  1. [Guid("73D3BE6A-E3B3-46F7-AFFE-8673390DA3F6"), ProgId("ActiveXDemo.UserControl1"), ComVisible(true)]

可能发生的问题

到目前为止,ActiveXDemo项目完工了,ActiveXDemo项目右键-->生成。

这个时候,我这边出现了一个错误:

错误 1 无法注销程序集“D:\learnActiveX\ActiveXDemo\ActiveXDemo\bin\Debug\ActiveXDemo.dll”- 拒绝访问。请确保您正在以管理员身份运行应用程序。不允许所请求的注册表访问权。ActiveXDemo

最后发现用管理员身份运行VS2012,然后打开ActiveXDemo项目,再生成,就不会报错了。

三、打包部署

1.解决方案ActiveXDemo右键-->添加新项目-->其他项目类型-->安装和部署。如果你没有安装过这个,请先安装。命名为ActiveSetup

2.选择application information:基本配置,自定义填写

3.接下来先把Application Files,点击MyCompany下的第一个节点可以自己重命名

4.点击 Add Project OutPuts,选择主输出点ok

5.ActiveSetup项目右键,生成。在ActiveSetup\Express\DVD-5\DiskImages\DISK1文件夹下有如下文件:

一个exe一个mis我们只用mis的

还要一个cabarc.exe这个我会在下载里给大家提供

 cabarc.exe:微软提供的cab打包工具

ActiveXSetup.msi:  项目生成的部署安装文件

install.inf : 需要跟ActiveXSetup.msi打包在一起的文件

build.bat:  打包的批处理命令

install.inf

[version]
signature="$CHICAGO$"
AdvancedINF=2.0

[Setup Hooks]
hook1=hook1

[hook1]
run=msiexec.exe /i "%EXTRACT_DIR%\ActiveXSetup.msi" /qn

build.bat

"cabarc.exe"  n test.cab ActiveXSetup.msi install.inf 

运行一下bat就可以生成一个
cab

我们随便建一个webfrom网站

在debug下边建一下dll文件夹

把test.cab放到文件夹里

cabarc.exe:微软提供的cab打包工具 地址 :files.cnblogs.com/files/dongh/cab%E5%88%B6%E4%BD%9C%E5%B7%A5%E5%85%B7.rar

时间: 2024-10-22 16:59:03

C# 制作ActiveX控件并添加到网页的相关文章

C#制作ActiveX控件及部署升级(摘自网络)

使用C#开发ActiveX控件 控件开发.制作CAB包.签名.部署 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力.通常ActiveX控件都是用C++或VB语言开发,本文介绍另一种方式,在.NET Framework平台上,使用C#语言开发ActiveX控件. 虽然本文通篇都在讲如何使用C#语言开发ActiveX控件,但我并不极力推荐使用这种技术,因为该技术存在明显的局限,即需

C#制作ActiveX控件中调用海康SDK的问题

这个事情就是一个坑,耽误了两周时间,之前并没有做过ActiveX这玩意,现在客户需求如此,只能说是在网上看着教程做了. 事情是这样的,有一台海康威视的摄像头,客户需要一个ActiveX控件嵌入到网页中,通过点击按钮开始录制和结束录制来进行视频的录制和保存,关于海康摄像头的二次开发在此就不多说了,可以参考SDK中的说明. 直接上流程: 1.开发环境: VS2010,这个打包方便,之前用VS2013打包的,总是调用不了,不知道原因是什么:SDK是32位的,用64位的在Winform中可以正常使用,在

C++ ActiveX控件的开发

最近在做一款局域网的web应用,采用B/S模式,但是其中一个模块需要在网页端做出读写IC卡的操作,如果在后台直接调用读卡器接口只能触发服务器端对读卡器的动作,想要实现在浏览器端直接操作读卡器,就需要自己制作activeX控件,然后在网页前台调用控件的一些方法.属性或事件. 1.创建ActiveX控件项目 输入项目名称,点击确定->完成 查看类视图其中主要用到“工程名Ctrl”类和“工程名Lib”下的“_D工程名”接口 2.项目配置 右键项目->属性->配置属性->常规: 1)“MF

ActiveX控件资料

Visual Studio 2008(c#)开发ActiveX控件及制作CAB包总结(1) 分类: C#2011-05-27 15:50 403人阅读 评论(0) 收藏 举报 c#stringhookserver测试xhtml 1.开发及测试环境: (1)开发环境: Visual Studio 2008 SP1 cabsdk(下载地址:http://support.microsoft.com/kb/310618) (2)测试环境: Windows Server 2003 R2 SP2 IE6 2

Delphi 编写ActiveX控件(OCX控件)的知识和样例(有详细步骤)

一.ActiveX应用情况简介: ActiveX控件也就是一般所说的OCX控件,它是 ActiveX技术的一部分.ActiveX是微软公司推出的基于组件对象模型COM的技术,包括对Windows 32位应用编程接口(Win32 API)和组件对象模型的一系列扩充和增强,目标是把计算机桌面环境与因特网环境集成起来,同时保护在Windows技术中现有的开发投资.微软的 ActiveX技术根本上就是修改过的OCX技术,使它能够跨越Internet,主要是使用WWW来传递控件.            A

ActiveX控件是什么?

一.ActiveX的由来 ActiveX最初只不过是一个商标名称而已,它所涵盖的技术并不是各自孤立的,其中多数都与Internet和Web有一定的关联.更重要的是,ActiveX的整体技术是由Microsoft的COM(Component Object Model,组件对象模型)构筑的.但不要误认为ActiveX是定义了所有包含基于COM的技术.COM与Microsoft Office和Windows以及Microsoft现在所做的一切都有关联,但显然这些产品并不是ActiveX家族中的成员.

WPF 添加ACTIVEX 控件 ——System.Windows.Forms.AxHost+InvalidActiveXStateException异常

---恢复内容开始--- 一.ACTIVEX及其相关概念 COM(Component Object Model,对象组件模型): DCOM(Distributed COM,分布式对象组件模型): CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构): 动态数据交换(Dynamic Data Exchange,DDE),解决了数据的更新,但数据格式仍是问题: 对象的链接与嵌入(Object Linking and Embedde

C#实现ActiveX控件开发与部署

现在,我们手里已经有了这个控件包:QRCode.cab,下面我们编写一个测试的网页 <html> <head> <title>无标题页</title> <script type="text/javascript" language="javascript"> function Test() { qrcodeocx.DecodeQRCode("@UEsDBBQAAAAIADWPjj3wRxgnaAA

.NET : 开发ActiveX控件(转载)

我估计有些朋友不清楚ActiveX控件,但这篇博客不是来解释这些概念的.如果你对ActiveX的概念不清楚,请参考这里: http://baike.baidu.com/view/28141.htm 这篇博客也不是讨论ActiveX是否有必要用的,因为这历来也是有些争议的.anyway, 我们这里只是探讨一下如何在.NET中也编写ActiveX控件,我用一个实例记录一下该过程 1. 创建一个类库项目,设置 Comvisible为true,设置AllowPartiallyTrustedCallers