C# 在 vs2010 上开发 ActiveX 控件 【千辛万苦啊~】
由于B/S项目中需要使用到读卡器的功能,但是由于厂家只有提供一个 读卡的dll,那么怎样能在客户端使用读卡器呢,那么进过一番查找,最总决定使用ActiveX 控件来做。由于是第一次接触到 ActiveX 控件,所以再次过程中也是经历了千辛万苦,无数次的绝望,无数次的想放弃,不过最终还是查阅无数资料和无数次的尝试修改,总算是搞定了这一个项目!
本来我是打算用 vs2013 来做的,但是各种尝试都没有成功,主要是因为从vs2012 开始,微软没有用自家的安装部署功能了,而是用了别家的工具(详细了解可以去百度一下) 。 最后还是妥协了,特别下载了vs2010 来做。

这是vs2010 安装部署的界面

这是 vs2013 的安装部署界面
Oh~ yeah~
接下来把详细的过程写出来:
网上倒是有不少的例子,但是都不是最完整的,照着任何一个做都没有成功,最后结合了一下,才做了出来~
1. 已管理员身份运行 vs2010, 创建windows 窗体控件库,删除已有的 UserControl1.cs 控件,然后添加一个新的用户控件

2. 右键--项目属性:
应用程序 -- 程序集信息--:勾选 使程序集COM可见
生成:勾选为COM互操作注册


3. 修改AssemblyInfo.cs文件,添加[assembly: AllowPartiallyTrustedCallers()]项(需要引用System.Security名称空间):

4. 为控件类添加GUID,这个编号将用于B/S系统的客户端调用时使用(可以使用 工具-创建GUID 菜单创建一个GUID,再复制):


5. 为了让ActiveX控件获得客户端的信任,控件类还需要实现一个名为“IObjectSafety”的接口,要创建该接口(注意,不能修改该接口的GUID值),IObjectSafety.cs代码如下:
namespace CardControl_01
{
[ComImport, Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IObjectSafety
{
[PreserveSig]
void GetInterfacceSafyOptions(
int riid,
out int pdwSupportedOptions,
out int pdwEnabledOptions); [PreserveSig]
void SetInterfaceSafetyOptions(
int riid,
int dwOptionsSetMask,
int dwEnabledOptions); }
}
6.然后在控件类中继承并实现该接口,可以直接复制不用作任何更改:
namespace CardControl_01
{
//使用生成的 GUID
[GuidAttribute("8C680F71-C52F-494E-BD0F-A860B17B1D94")]
public partial class CardControl : UserControl, IObjectSafety
{
public CardControl()
{
InitializeComponent();
} #region IObjectSafety 成员 public void GetInterfacceSafyOptions(int riid, out int pdwSupportedOptions, out int pdwEnabledOptions)
{
pdwSupportedOptions = ;
pdwEnabledOptions = ;
} public void SetInterfaceSafetyOptions(int riid, int dwOptionsSetMask, int dwEnabledOptions)
{
throw new NotImplementedException();
}
#endregion #region 读卡处理操作逻辑
[SecuritySafeCritical]
private void btnRead_Click(object sender, EventArgs e)
{ string data = new MJReadCard.CardManager().Read();
if (data.Equals("-1"))
{
lbStatus.Text = "状态:读数据失败!";
}
else
{
txtShow.Text = data;
lbStatus.Text = "状态:读数据成功!";
}
} [SecuritySafeCritical]
public string Read()
{
return new MJReadCard.CardManager().Read();
} [SecuritySafeCritical]
private void btnWrite_Click(object sender, EventArgs e)
{
string data = txtShow.Text.Trim();
bool res = new MJReadCard.CardManager().Write(data);
if (!res)
{
lbStatus.Text = "写数据失败";
}
else
{
lbStatus.Text = "写数据成功";
}
} [SecuritySafeCritical]
public bool Write(string data)
{
return new MJReadCard.CardManager().Write(data);
}
#endregion }
}
7. 开始打包发布:
(1). 添加新的项目

(2). 添加项目输出,还有就是添加文件,相关引用到的 dll



8. 最后生成项目后, 会在Debug文件夹下面生成 setup.exe 文件和一个 .msi 文件,我们项目中需要使用到的就是 setup.exe
9. 创建网站测试项目

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<!--读卡器-->
<object id="ActiveX" classid="clsid:8C680F71-C52F-494E-BD0F-A860B17B1D94" codebase="/AcitveXF/setup.exe" style=""></object> <input id="btn" type="button" value="Read" /> <script type="text/javascript"> var btn = document.getElementById("btn");
btn.onclick=function(){
var cardID = ActiveX.Read();
alert(cardID);
}
</script> </body>
</html>
最终效果如下:

后续还有一些打包签名之类的操作,那么就再去网上找找....有很多的~
C# 在 vs2010 上开发 ActiveX 控件 【千辛万苦啊~】的更多相关文章
- 【VS开发】在VS2010中开发ActiveX控件设置测试容器的方式
在VS2010中开发ActiveX控件设置测试容器的方式 借鉴文章http://blog.csdn.net/waxgourd0/article/details/7374669 在VS2010中开发MF ...
- 使用C#开发ActiveX控件(新)
前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力.通常ActiveX控件都是 ...
- 使用C#开发ActiveX控件(新) 转 http://www.cnblogs.com/yilin/p/csharp-activex.html
前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力.通常ActiveX控件都是 ...
- 使用C#开发ActiveX控件
使用C#开发ActiveX控件(新) 前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动 ...
- 使用C#开发ActiveX控件[new]
文章出处:http://www.cnblogs.com/yilin/p/csharp-activex.html 前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以 ...
- C#开发Activex控件(转载别人的只为再看时方便放在自己里边了)
前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能, 以增强浏览器端的动态处理能力.通常ActiveX控件都 ...
- 在此页上的ActiveX控件和本页上的其他部分的交互可能不安全,你想允许这种交互吗
转自 http://www.cnblogs.com/zdxster/archive/2011/01/27/1945868.html 在EOS6的项目中,如果采用VC++开发的ActiveX,那么第一次 ...
- [转]C#开发ActiveX控件,.NET开发OCX控件案例
引自:百度 http://hi.baidu.com/yanzuoguang/blog/item/fe11974edf52873aaec3ab42.html 讲下什么是ActiveX控件,到底有什么 ...
- [转] 使用C#开发ActiveX控件
双魂人生 原文 使用C#开发ActiveX控件 ActiveX 是一个开放的集成平台,为开发人员.用户和 Web生产商提供了一个快速而简便的在 Internet 和 Intranet 创建程序集成和内 ...
随机推荐
- Android之Inflate()
Inflate()作用就是将xml定义的一个布局找出来,但仅仅是找出来而且隐藏的,没有找到的同时并显示功能.最近做的一个项目就是这一点让我迷茫了好几天. Android上还有一个与Inflate( ...
- Java学习随笔4:Java的IO操作
1. IO流的作用是读写设备上的数据,如硬盘文件.内存.键盘.网络等.根据数据走向,可分为:输入流和输出流:根据处理的数据类型,可分为:字节流和字符流.字节流可以处理所有类型的数据,如MP3.图片.视 ...
- 【MyEcplise hibernate tools】hibernate tools的使用以及错误
1.点击Myecplise右上角 2.点击进入后,在这个区域右键 New 一个新的connection 3.以mySql连接为例子,在这里展示一下,下面这几项必须都要按照要求完全一致,除了架包所在的本 ...
- HDU 4162 Shape Number (最小表示法)
题意:给你一串n个数,求出循环来看一阶差的最小字典序:数字串看成一个顺时针的环,从某一点开始顺时针循环整个环,保证字典序最小就是答案 例如给你 2 1 3 就会得到(1-2+8 注意题意负数需要加8) ...
- RPG的错排
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- 九校联考 终&启
one term's ending... class:12 school:130...130...130... 至今没有看到九校的排名,如果九校排名正常的话,那yyhs的学生也太可怕了...估计要三百 ...
- http://www.roncoo.com/course/view/a09d8badbce04bd380f56034f8e68be0
http://www.roncoo.com/course/view/a09d8badbce04bd380f56034f8e68be0
- jQuery回车键提交表单
$(document).keyup(function(event) { if(event.keyCode==13) { $('btnSubmit').trigger(& ...
- 类型“System.Windows.Markup.IQueryAmbient”在未被引用的程序集中定义
错误 1 类型"System.Windows.Markup.IQueryAmbient"在未被引用的程序集中定义.必须添加对程序集"System.Xaml, ...
- 修改文档框架:word-多级列表与标题样式相结合
转自:http://blog.sina.com.cn/s/blog_6721f25c0100nuf0.html 设置标题的时候希望出现多标题并且自动编号的标题,如下1. XXXXXXXXXXX ...