其实如果我们不进行设置,只是修改了代码,运行程序以后,其出错界面如下图1所示:
抛出异常如下:
************** Exception Text **************
System.MethodAccessException: Attempt by security transparent method 'Rare.Card.Libary.Controls.
ReadCardControl.btnRead_Click(System.Object, System.EventArgs)' to call native code through method 'Rare.Card.Libary.MifareOneHelper.rf_read(Int32, Int32, Byte[])' failed. Methods must be security critical or
security safe-critical to call native code.
通过查阅MSDN,对异常的解释如下:
在 Microsoft .NET Framework 4 中,公共语言运行时 (CLR) 安全模型发生了不少变化。其中一项变化,即采用 Level2 透明性
(与 Silverlight 的安全模型非常相似)很可能影响 AllowPartiallyTrustedCallers (APTCA) 库的作者。透明性属性有三种:SecurityTransparent、SecuritySafeCritical 和 SecurityCritical。
SecurityTransparent:标记为 SecurityTransparent 的代码从安全性角度而言是可靠的。它不能完成任何危险操作,例如声明权限、
执行无法验证的代码或调用本机代码。它也不能直接调用 SecurityCritical 代码。
如上文所述,出于安全的考虑,所有部分受信任代码都强制为 SecurityTransparent。这也是 APTCA 库的默认透明性。
SecurityCritical:与 SecurityTransparent 不同,SecurityCritical 代码能够执行任何所需操作。它能够执行声明、
调用本机代码和其他操作。它能够调用其他方法,且不受透明性标记的限制。
只有完全受信任代码才能为 SecurityCritical。事实上,(非 APTCA)完全受信任代码默认情况下属于 SecurityCritical,
从而保护其免受透明的部分受信任调用方的调用。
SecuritySafeCritical:SecuritySafeCritical 代码起着桥梁的作用,它允许透明代码调用关键方法。SecuritySafeCritical
代码与 SecurityCritical 代码的权限相同,但它可由 SecurityTransparent 代码调用。因此,SecuritySafeCritical 代码必须以安全方式公开基础 SecurityCritical 方法(以避免一些部分受信任的恶意代码尝试通过 SecuritySafeCritical 层攻击这些方法),这一点极为重要。
与 SecurityCritical 代码一样,SecuritySafeCritical 代码必须完全受信任。
根据MSDN的解释,问题出在了封装原始Dll的C#类库CardReader.Library上,我们可以在代码级别设置透明性属性可以解决问题。
具体解决办法如下:
1. 设置ActiveX控件读卡代码的透明属性为:SecuritySafeCritical,设置以后的代码清单如下:
[SecuritySafeCritical] /// <summary> /// 读卡 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnRead_Click(object sender, EventArgs e) { int i = 0; byte[] data = new byte[16]; byte[] buff = new byte[32]; for (i = 0; i < 16; i++) data[i] = 0; for (i = 0; i < 32; i++) buff[i] = 0; st = MifareOneHelper.rf_read(icdev, sec * 4 + 1, data); if (st == 0) { SerialInterfaceHelper.hex_a(data, buff, 16); txtCardID.Text = System.Text.Encoding.ASCII.GetString(buff); lblMsg.Text = "读取卡号成功!"; } else lblMsg.Text = "读取卡号失败!"; //test method //if (string.IsNullOrEmpty(txtCardID.Text)) //{ // lblMsg.Text = "读取数据失败!"; //} //else //{ // lblMsg.Text = string.Format("读取数据:{0}!", txtCardID.Text); //} }
注意要添加引用:using System.Security;
在这里注掉了测试代码,使用了串口通信和读卡代码。
2. 设置封装原始读卡器Dll的透明属性。
设置M1读卡器帮助类MifareOneHelper的透明属性为:[SecurityCritical],同时设置调用的方法MifareOneHelper.rf_read的
透明属性为[SecurityCritical]。
设置串口通信帮助类SerialInterfaceHelper的透明属性为:[SecurityCritical],同时设置调用的方法SerialInterfaceHelper.hex_a的
透明属性为[SecurityCritical]。
完整代码已提供,还有2个地方需要注意的是,客户端如果安装ActiveX失败,则把运行ActiveX的地址加入到信任站点里,
信任站点的安全级别降低到最低或者设置信任站点关于ActiveX的选项。
更多使用VS2010 C#开发ActiveX控件(下),完整代码打包下载相关文章请关注PHP中文网!

本文探讨了C中的无指针启用的挑战。它认为问题本身不是零,而是滥用。 本文详细介绍了预防退出的最佳实践,包括提出前检查,指针pitiberi

本文解释了如何使用printf中的\ n逃脱序列在C中创建新线字符并列出函数。 它详细介绍了功能并提供了代码示例,以说明其用于输出中的线路断裂。

本文指导初学者选择C编译器。 它认为,海湾合作委员会由于其易用性,广泛的可用性和广泛的资源,最适合初学者。 但是,它也比较了海湾室,Clang,MSVC和TCC,突出了它们的差异

本文强调了NULL在现代C编程中的持续重要性。 尽管取得了进步,但NULL对于明确的指针管理仍然至关重要,从而通过标记没有有效的内存地址来防止细分故障。 最好的prac

本文回顾了初学者的在线C编译器,重点是易用性和调试功能。 在线GDB和REPL。 其他选项,例如Programiz和Compil

本文比较在线C编程平台,突出了诸如调试工具,IDE功能,标准合规性和内存/执行限制等功能的差异。 它认为“最佳”平台取决于用户需求

本文讨论了C IDE中的有效代码复制。 它强调,复制是IDE功能,而不是编译器功能,并且详细提高了效率的策略,包括使用IDE选择工具,代码折叠,搜索/替换,Templa

本文在C程序编译中对缺少输出窗口进行故障排除。 它研究了诸如无法运行可执行文件,程序错误,错误编译器设置,背景过程和快速程序终止之类的原因。解决方案涉及ch


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

Dreamweaver CS6
视觉化网页开发工具

禅工作室 13.0.1
功能强大的PHP集成开发环境

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境