由于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 控件 【千辛万苦啊~】的更多相关文章

  1. 【VS开发】在VS2010中开发ActiveX控件设置测试容器的方式

    在VS2010中开发ActiveX控件设置测试容器的方式 借鉴文章http://blog.csdn.net/waxgourd0/article/details/7374669 在VS2010中开发MF ...

  2. 使用C#开发ActiveX控件(新)

    前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力.通常ActiveX控件都是 ...

  3. 使用C#开发ActiveX控件(新) 转 http://www.cnblogs.com/yilin/p/csharp-activex.html

    前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力.通常ActiveX控件都是 ...

  4. 使用C#开发ActiveX控件

    使用C#开发ActiveX控件(新) 前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动 ...

  5. 使用C#开发ActiveX控件[new]

    文章出处:http://www.cnblogs.com/yilin/p/csharp-activex.html 前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以 ...

  6. C#开发Activex控件(转载别人的只为再看时方便放在自己里边了)

    前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能, 以增强浏览器端的动态处理能力.通常ActiveX控件都 ...

  7. 在此页上的ActiveX控件和本页上的其他部分的交互可能不安全,你想允许这种交互吗

    转自 http://www.cnblogs.com/zdxster/archive/2011/01/27/1945868.html 在EOS6的项目中,如果采用VC++开发的ActiveX,那么第一次 ...

  8. [转]C#开发ActiveX控件,.NET开发OCX控件案例

    引自:百度   http://hi.baidu.com/yanzuoguang/blog/item/fe11974edf52873aaec3ab42.html 讲下什么是ActiveX控件,到底有什么 ...

  9. [转] 使用C#开发ActiveX控件

    双魂人生 原文 使用C#开发ActiveX控件 ActiveX 是一个开放的集成平台,为开发人员.用户和 Web生产商提供了一个快速而简便的在 Internet 和 Intranet 创建程序集成和内 ...

随机推荐

  1. 汇编指令CLI/STI

    CLI禁止中断发生STL允许中断发生 这两个指令只能在内核模式下执行,不可以在用户模式下执行:而且在内核模式下执行时,应该尽可能快的恢复中断,因为CLI会禁用硬件中断,若长时间禁止中断会影响其他动作的 ...

  2. Linux C编程(1) vim及gcc命令

    1. 输入以下命令可以启动vi:      (1) vi:不指定文件名,在保存文件时需要指定文件名.      (2) vi 文件名:该文件既可以是已存在的,也可以是新建的.      (3) vi ...

  3. 全面解析windows下Memcache技术应用

    原文  http://www.cnblogs.com/liuqin520/p/4615644.html   一.Memcache介绍 Memcache 是 danga.com 的一个项目,最早是为 L ...

  4. 简单区分VMware的三种网络连接模式(bridged、NAT、host-only)

    艺搜简介 VMware在安装时默认安装了两块虚拟网卡,VMnet1和VMnet8,另外还有VMnet0.这些虚拟网卡的配置都是由Vmware虚拟机自动生成的,一般来说不需要用户自行设置. Vmware ...

  5. 实现Web验证码图片-原理

    实现验证码的基础 GDI+ graphics device interface plus的缩写,即图形设备接口.GDI+为开发者提供了一组实现与各种设备(具有图形化能力但不涉及图形细节的设备)进行交互 ...

  6. Netty 入门示例

    服务端代码示例 import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channe ...

  7. nodejs随记01

    EventEmitter var stream = require('stream'); var Readable = stream.Readable; //写入类(http-req就是),初始化时会 ...

  8. SQL ISNULL 函数

    sql 中 NULL 值的处理:微软的 ISNULL() 函数用于规定如何处理 NULL 值.NVL(), IFNULL() 和 COALESCE() 函数也可以达到相同的结果.语法ISNULL ( ...

  9. Service Provider模式

    参考文章:[http://blog.csdn.net/zl3450341/article/details/7227197] Service Interface:服务接口,将服务通过抽象统一声明,供客户 ...

  10. C#中js文本提示

    Page.ClientScript 与 ClientScript 的关系 这二者实际上是一个东西,后者只是省略了 Page.都是获取用于管理脚本.注册脚本和向页添加脚本的 ClientScriptMa ...