在VS2010中使用C#开发基于WinForm的ActiveX控件

常见的一些ActiveX大部分是使用VB、Delphi、C++开发,使用C#开发ActiveX要解决下面三个问题:

  • 使.NET组件可以被COM调用
  • 在客户机上注册后,ActiveX控件能通过IE的安全认证
  • 已在客户机上注册时,安装包能通过IE的签名认证

配置:win 7,VS2010

步骤第一步,创建控件

1.创建WinForm控件,命名为WebForm,如图1:

2.设置项目的Assembly属性,如图2所示,并对Make Assembly Com-Visible选项划钩

并且设置项目的编译选项,如图3所示,对Register for COM Interop选中对COM组件进行注册。(注意,此处如果实在debug状态下修改的,那在调到release状态下还需要再设置一次。)

3.打开AssemblyInfo文件添加引用 using System.Security; 并且添加 [assembly: AllowPartiallyTrustedCallers()] 语句

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security; //note! // General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("WebForm")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("WebForm")]
[assembly: AssemblyCopyright("Copyright © 2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AllowPartiallyTrustedCallers()] // note!

4.为控件类创建一个唯一的GUID,注意这里的GUID不能和AssemblyInf中的GUID相同,生成GUID的方法如下

使用Microsoft Windows SDK Tools中的GUID Generator生成新的GUID,如图

COPY生成的GUID到记事本,再拷贝GUID的字符串到控件类,并添加引用 using System.Runtime.InteropServices;

using System.Runtime.InteropServices;    // note !

namespace WebForm
{
[Guid("575483BC-7224-44F5-A77C-78AB7FC4E606")] // note! public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
} }
}

第二部分,打包发布ActiveX控件

5.ActiveX控件可以使用VS 2010的安装项目进行部署,使用VS 2010创建Windows Form的安装工程就可以将ActiveX的dll进行打包。在打包时注意将ActiveX控件项目作为主输出项目,并设置其Register属性为vsdrpCOM,创建打包项目如下图5所示:

之后添加项目输出,如下图

6.设置项目属性,如下图,文件名就是打包后安装文件.MSI的文件名。设置包文件、压缩方式,CAB size,这三项均选择默认值即可。

最后设置安装URL,这里的安装URL是用来发布或者测试ActiveX的URL地址的,我们设置为本地url:K:/VSProject/WebForm/Setup/Debug/

7. 将之前的WebForm.dll打包进ActiveX控件。

将WebForm.dll放入包中,如下图,build solution之后,便会出现Setup.exe和Setup.msi两个文件,其中Setup.exe就是我们在使用ActiveX时的codebase文件。

8.测试基于WinForm的ActiveX控件。新建一个htm文件,输入如下代码并保存:

其中id为建立的控件类名,classid为步骤中生成的Guid,codebase为本地的ActiveX安装源,如果做服务器可以修改为ip源等,这里暂不赘述。

<object id="UserControl1"
classid="clsid:575483BC-7224-44F5-A77C-78AB7FC4E606"
width="500"
height="500"
codebase="K:/VSProject/WebForm/Setup/Debug/Setup.exe">
</object>

测试结果

如图,由C#创建的基于WinForm的控件可以正确的显示在IE Explorer中

参考资料

http://www.cnblogs.com/yungboy/archive/2011/01/10/1932433.html

http://homer.cnblogs.com/archive/2005/01/26/97822.aspx

http://www.cnblogs.com/Charles2008/archive/2010/04/11/1709844.html

http://www.cnblogs.com/homer/archive/2005/01/04/86473.html

http://www.cnblogs.com/homer/archive/2005/01/08/88780.html

http://www.cnblogs.com/homer/archive/2005/01/08/88780.html

{VS2010C#}{WinForm}{ActiveX}VS2010C#开发基于WinForm的ActiveX控件的更多相关文章

  1. winform项目中开发的一套UI控件库

    https://github.com/houyhea/winform-control-lib winform-control-lib 曾经在一个winform项目中开发的一套UI控件库 类图:  效果 ...

  2. WinForm开发中通用附件管理控件设计开发参考

    1.引言 在WinForm开发中,文件附件的管理几乎在任何一个应用上都会存在,是一个非常通用集中的公共模块.我们日常记录会伴随着有图片.文档等附件形式来展现,如果为每个业务对象都做一个附件管理,或者每 ...

  3. [转] WinForm自定义函数FindControl实现按名称查找控件

    原文地址 WinForm自定义函数FindControl实现按名称查找控件 本文所述实例实现WinForm自定义函数FindControl实现按名称查找控件的功能,在C#程序开发中有一定的实用价值. ...

  4. winform中button点击后再点击其他控件致使button失去焦点,此时button出现黑色边线,去掉黑色边线的方法

    winform中button点击后再点击其他控件致使button失去焦点,此时button出现黑色边线,去掉黑色边线的方法 button的FlatAppearence属性下,设置BorderSize= ...

  5. winform中如何在多线程中更新UI控件--ListView实时显示执行信息

    1.在winform中,所有对UI的操作,都得回到UI线程(主线程)上来,才不会报错 线程间操作无效: 从不是创建控件的线程访问它. 2.在winform中,允许通过Control.invoke对控件 ...

  6. SNF开发平台WinForm-表单验证控件-通用

    CS程序也能做到像BS程序一样的验证效果,如下: 1.验证控件的展示 校验时如果不符合验证条件的控件,会在控件上显示较显眼的图标. 当出现不符合验证的控件时,鼠标悬浮会显示自定义的提示信息. 如:输入 ...

  7. ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇

    原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇 第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是 ...

  8. C/S模式开发中如何利用WebBrowser控件制作导航窗体

    原文:C/S模式开发中如何利用WebBrowser控件制作导航窗体 转自: CSDN 相信不少同学们都做过MIS系统的开发,今天这里不讨论B/S模式开发的问题.来谈谈winform开发.用过市面上常见 ...

  9. c#调用c++制作的基于mfc的ocx控件

    原文:http://blog.csdn.net/yhhyhhyhhyhh/article/details/51286926 原文中有问题部分已修改. c#调用c++制作的基于mfc的ocx控件     ...

随机推荐

  1. Java 设计一个贷款计算器 简易

    import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.border.*; publi ...

  2. 问:Linux下Chrome标题栏中文乱码

    From:http://blog.csdn.net/loveaborn/article/details/29579787 在使用Linux的时候你会遇到一些奇奇怪怪的问题,不过,你会在解决这些问题的过 ...

  3. window.location和window.open

    window.location和window.open的区别 window.location = "http://www.baidu.com" 跳转后有后退功能 window.lo ...

  4. python数据结构与算法——栈

    # 栈# 其实python里面的list就可以当栈使用啦,用collections.deque也可以# 1. 入栈 list.append(item)# 2. 出栈 item = list.pop() ...

  5. HDFS介绍

    一.HDFS概述 1.HDFS设计思想来源于Google的GFS,是GFS的开源实现. 2.HDFS要解决的问题: -存储超大文件,比如TB级别 -防止文件丢失. 3.HDFS的特点 -可以存储超大文 ...

  6. [USACO08DEC] Trick or Treat on the Farm

    题目描述 每年万圣节,威斯康星的奶牛们都要打扮一番,出门在农场的N个牛棚里转 悠,来采集糖果.她们每走到一个未曾经过的牛棚,就会采集这个棚里的1颗糖果. 农场不大,所以约翰要想尽法子让奶牛们得到快乐. ...

  7. OpenMP对于嵌套循环应该添加多少个parallel for 分类: OpenMP C/C++ Linux 2015-04-27 14:48 53人阅读 评论(0) 收藏

    一个原则是:应该尽量少的使用parallelfor, 因为parallel for也需要时间开销.即: (1)如果外层循环次数远远小于内层循环次数,内层循环较多时,将parallel for加在内层循 ...

  8. 深入C#中get与set的详解(转)

    转自:http://www.jb51.net/article/37960.htm 释一:属性的访问器包含与获取(读取或计算)或设置(写)属性有关的可执行语句.访问器声明可以包含 get 访问器或 se ...

  9. 每日学习心得:Js基本数据类型常用方法扩展

    2014-02-17 前言: 节后的第一周上班,整个状态调整的还不错,已完全进入正常的工作状态.这一周主要还是对年前项目存在的一些问题进行完善.修整,基本上没有做大的改动.这里就把项目中经常用到的一些 ...

  10. bzoj3822: 文学

    Description 巨酱和主席是一对好朋友.他们都很喜欢读书,经常一起阅读相关领域书籍,进行系统的学习.一天主席列出了一份列表,里面共 p 本书,其中不乏<约翰克里斯多夫>,<名 ...