C# 调用动态链接库读取二代身份证信息

概述

一般来说winform应用程序解决这个问题起来时很容易的,web应用程序就麻烦一点了。你必要有联机型居民身份证阅读器一个。

实现方式

1、新建一个winform控件项目ReadCardControl,添加一个主类ReadIDCard

private bool  ReadIDCard(){try{BLL.API.SynIDCardAPI.IDCardData CardMsg = new BLL.API.SynIDCardAPI.IDCardData();int nRet, nPort;byte[] pucIIN = new byte[4];byte[] pucSN = new byte[8];nPort = Convert.ToInt32(1001);if (BLL.API.SynIDCardAPI.Syn_OpenPort(nPort) == 0){if (BLL.API.SynIDCardAPI.Syn_SetMaxRFByte(nPort, 80, 0) == 0){nRet = BLL.API.SynIDCardAPI.Syn_StartFindIDCard(nPort, ref pucIIN[0], 0);nRet = BLL.API.SynIDCardAPI.Syn_SelectIDCard(nPort, ref pucSN[0], 0);nRet = BLL.API.SynIDCardAPI.Syn_ReadMsg(nPort, 0, ref CardMsg);if (nRet == 0){txtAddress.Text = CardMsg.Address;txtBirthday.Text = CardMsg.Born;txtCerticate.Text = CardMsg.IDCardNo;txtIssuingAuthoriy.Text = CardMsg.GrantDept;txtNames.Text = CardMsg.Name;txtNation.Text = Xw.Common.Helper.NationHelper.GetNationByNO(CardMsg.Nation);txtSex.Text = CardMsg.Sex == "1" ? "男" : "女";picMan.Image = Image.FromFile(CardMsg.PhotoFileName);//lblMsg.Text = "读卡成功";return true;}else{lblMsg.Text = "请放卡: 读取身份证信息错误";return false;}}}else{lblMsg.Text = "打开端口失败";return false;}return true;}catch (Exception ex){Xw.Common.Helper.LogHelper.WriteErrorToLog(ex.Message);return false;}}

2、声明DllImport,调用动态链接库

  public  class SynIDCardAPI{#region IDCardData[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]public struct IDCardData{[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] //结构中使用的字串,[]类似限定说明 说明此公共结构传输到非托管代码时封装定义public string Name; //姓名   [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]public string Sex;   //性别[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]public string Nation; //名族[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]public string Born; //出生日期[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 72)]public string Address; //住址[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 38)]public string IDCardNo; //身份证号[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]public string GrantDept; //发证机关[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]public string UserLifeBegin; // 有效开始日期[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]public string UserLifeEnd;  // 有效截止日期[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 38)]public string reserved; // 保留[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]public string PhotoFileName; // 照片路径}#endregion#region SynIDCardAPI/************************端口类API *************************/[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetMaxRFByte", CharSet = CharSet.Ansi)]public static extern int Syn_SetMaxRFByte(int iPort, byte ucByte, int iIfOpen);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetCOMBaud", CharSet = CharSet.Ansi)]public static extern int Syn_GetCOMBaud(int iPort, ref uint puiBaudRate);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetCOMBaud", CharSet = CharSet.Ansi)]public static extern int Syn_SetCOMBaud(int iPort, uint uiCurrBaud, uint uiSetBaud);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_OpenPort", CharSet = CharSet.Ansi)]public static extern int Syn_OpenPort(int iPort);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ClosePort", CharSet = CharSet.Ansi)]public static extern int Syn_ClosePort(int iPort);/**************************SAM类函数 **************************/[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ResetSAM", CharSet = CharSet.Ansi)]public static extern int Syn_ResetSAM(int iPort, int iIfOpen);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMStatus", CharSet = CharSet.Ansi)]public static extern int Syn_GetSAMStatus(int iPort, int iIfOpen);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMID", CharSet = CharSet.Ansi)]public static extern int Syn_GetSAMID(int iPort, ref byte pucSAMID, int iIfOpen);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMIDToStr", CharSet = CharSet.Ansi)]public static extern int Syn_GetSAMIDToStr(int iPort, ref byte pcSAMID, int iIfOpen);/*************************身份证卡类函数 ***************************/[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_StartFindIDCard", CharSet = CharSet.Ansi)]public static extern int Syn_StartFindIDCard(int iPort, ref byte pucIIN, int iIfOpen);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SelectIDCard", CharSet = CharSet.Ansi)]public static extern int Syn_SelectIDCard(int iPort, ref byte pucSN, int iIfOpen);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadBaseMsg", CharSet = CharSet.Ansi)]public static extern int Syn_ReadBaseMsg(int iPort, ref byte pucCHMsg, ref uint puiCHMsgLen, ref byte pucPHMsg, ref uint puiPHMsgLen, int iIfOpen);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadIINSNDN", CharSet = CharSet.Ansi)]public static extern int Syn_ReadIINSNDN(int iPort, ref byte pucIINSNDN, int iIfOpen);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadBaseMsgToFile", CharSet = CharSet.Ansi)]public static extern int Syn_ReadBaseMsgToFile(int iPort, ref byte pcCHMsgFileName, ref uint puiCHMsgFileLen, ref byte pcPHMsgFileName, ref uint puiPHMsgFileLen, int iIfOpen);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadIINSNDNToASCII", CharSet = CharSet.Ansi)]public static extern int Syn_ReadIINSNDNToASCII(int iPort, ref byte pucIINSNDN, int iIfOpen);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadNewAppMsg", CharSet = CharSet.Ansi)]public static extern int Syn_ReadNewAppMsg(int iPort, ref byte pucAppMsg, ref uint puiAppMsgLen, int iIfOpen);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetBmp", CharSet = CharSet.Ansi)]public static extern int Syn_GetBmp(int iPort, ref byte Wlt_File);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadMsg", CharSet = CharSet.Ansi)]public static extern int Syn_ReadMsg(int iPortID, int iIfOpen, ref IDCardData pIDCardData);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_FindReader", CharSet = CharSet.Ansi)]public static extern int Syn_FindReader();/***********************设置附加功能函数 ************************/[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoPath", CharSet = CharSet.Ansi)]public static extern int Syn_SetPhotoPath(int iOption, ref byte cPhotoPath);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoType", CharSet = CharSet.Ansi)]public static extern int Syn_SetPhotoType(int iType);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoName", CharSet = CharSet.Ansi)]public static extern int Syn_SetPhotoName(int iType);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetSexType", CharSet = CharSet.Ansi)]public static extern int Syn_SetSexType(int iType);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetNationType", CharSet = CharSet.Ansi)]public static extern int Syn_SetNationType(int iType);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetBornType", CharSet = CharSet.Ansi)]public static extern int Syn_SetBornType(int iType);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetUserLifeBType", CharSet = CharSet.Ansi)]public static extern int Syn_SetUserLifeBType(int iType);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetUserLifeEType", CharSet = CharSet.Ansi)]public static extern int Syn_SetUserLifeEType(int iType, int iOption);#endregion}

3、读取显示相关的信息

  txtAddress.Text = CardMsg.Address;txtBirthday.Text = CardMsg.Born;txtCerticate.Text = CardMsg.IDCardNo;txtIssuingAuthoriy.Text = CardMsg.GrantDept;txtNames.Text = CardMsg.Name;txtNation.Text = Xw.Common.Helper.NationHelper.GetNationByNO(CardMsg.Nation);txtSex.Text = CardMsg.Sex == "1" ? "男" : "女";picMan.Image = Image.FromFile(CardMsg.PhotoFileName);//lblMsg.Text = "读卡成功";return true;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303563.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lighttpd mysql_lighttpd+mysql+php

博客已经搬家,请访问如下地址:http://www.czhphp.com一:安装mysql安装:unzip mysql-5.1.33.zipcd mysql-5.1.33.zip./configure –prefix/usr/local/mysql –enable-assembler –with-extra-charsetscomplex –enable-thread-safe…

ibatis学习笔记

http://code.google.com/p/mybatisnet/ 官网

入坑机器学习?送你一篇麻省博士的学习心得

[导读] 随着人工智能技术的火热,越来越多的年轻学者正准备投身其中,开启自己的研究之路。和所有其他学科一样,人工智能领域的新人总会遇到各种各样的难题,其中不仅有研究上的,也有生活方面的。MIT EECS 在读博士、前 V…

C# 读写Ini文件

ini文件在Win95以前比较盛行,之后由于出册表等技术的出现,ini技术主键退居二线,不过对于一些小项目,读写ini文件还是很适用的。Windows API提供了读写配置文件的操作,在C#程序中只要导入相应的API即可。例如GetPrivate…

更改windows2003远程最大连接数

windows 2003中的远程桌面功能非常方便,但是初始设置只允许2个用户同时登陆。有些时候因为我在公司连接登陆后断开,同事在家里用其他用户登陆后断开,当我再进行连接的时候,总是报错终端服务超过最大连接数。这时候我和同事都不能登…

mysql sp who_对ASE系统存储过程的剖析-sp_who

昨晚有空,把 sybase 系统过程 sp_who , DDL 后分析了一下,全文如下:-- 以下是 DDL 出来的内容:------------------------------------------------------------------------------- DDL for Stored procedure sybsyste…

区块链、自动驾驶、人工智能鏖战开始 谁将成为下一个风口?

近年来,区块链、自动驾驶以及人工智能的概念频繁爆红于科技界。有业者称,区块链的颠覆在于人们找到了一个低成本解决信任问题的方案;自动驾驶的出现方便了人们的交通出行;人工智能则为我们打开了新的世界。不论是区块链、自动驾驶…

JWT 介绍 - Step by Step

翻译自 Mohamad Lawand 2021年3月11日的文章 《Intro to JWT - Step by Step》 [1]在本文中,我将向您介绍 JWT[2]。我们今天要讲的内容包含:JWT 是什么我们应该在什么时候使用它JWT 与 Session Id 比较JWT 结构JWT 签名JWT 是什么JWT (JSON Web Token) 是…

Helpdesk 流程

最近Fox的公司部署了新的Helpdesk系统。为了让用户从原来打电话和发邮件寻求IT员工帮助的方式转变为使用Helpdesk系统提交tickets,需要制定和规范Helpdesk流程,小小推动下ITIL进程。 HelpDesk系统与AD集成。公司用户可以使用域用户名和密码登陆Helpdesk系…

vscode 快速调到定义处_vim技巧:在程序代码中快速跳转,在文件内跳转到变量定义处...

本篇文章介绍 vim 的一些使用技巧:在程序代码中快速跳转在文件内跳转到变量定义处在程序代码中快速跳转在 vim 中查看代码文件时,可以使用下面命令在程序代码中快速跳转,提高效率。%跳转到光标所在括号的另一个配对括号上,适用于小…

震撼!英伟达用深度学习做图像修复,毫无ps痕迹

在计算机视觉研究领域,NVIDIA常常让人眼前一亮。比如“用Progressive Growing的方式训练 GAN,生成超逼真高清图像”,“用条件 GAN 进行 2048x1024 分辨率的图像合成和处理”的pix2pixHD项目,或者脑洞大开的让晴天下大雨、小猫变狮…

程序员过关斩将--重复的请求并不好过滤

为什么要做重复请求的过滤呢?不过滤不行吗?过滤重复请求很难吗?加一个请求ID不就好了吗?每个技术难点的话题,肯定是由一个产品需求引发的,俗话说:如果没有产品经理,程序员将不需要听…

php与java安全之争

很多人说java比php安全,其实这个说法很多人误解,其实安全在于程序的逻辑,代码的严谨,另外就是服务器设置的安全,关于java比php的安全一说,我不同意,java编译的话,现在可以反编译&…

python编译安装没有c扩展_为什么在安装simplejson时得到“C扩展无法编译”?

顺便问一下,我使用的是windows,所以我必须安装visual studio吗?(py) D:\python>pip install simplejsonDownloading/unpacking simplejsonDownloading simplejson-2.6.2.tar.gz (53kB): 53kB downloadedRunning setup.py egg_info for pac…

.NET团队送给.NET开发人员的云原生学习资源

企业正在迅速采用云的功能来满足用户需求,提高应用程序的可伸缩性和可用性。要完全拥抱云并优化节约成本,就需要在设计应用程序时考虑到云的环境,也就是要用云原生的应用开发方法。这意味着不仅要更改应用程序的构建方式,还要更改…

深夜,学妹说她想做Python数据分析师

大家好,我是大鹏,目前是一名数据分析师。上周末晚上,我的学妹突然约我出来喝咖啡。想起学妹在学校就一直说想转行,最近在网上捣鼓自学数据分析软件有一小段时间了。我想她不是为了叙旧。果然来到咖啡店,她一屁股坐下来…

NFS

NFS(Network File System) NFS允许一个系统在网络上与它人共享目录和文件。通过使用NFS,用户和程序可以象访问本地文件一样访问远 端系统上的文件。 优点: 本地工作站使用更少的磁盘空间,因为通常的数据可以存放在一台机器上而且可以通过…

python面向对象继承_四. python面向对象(继承)

一. 继承class A:pass #父类 基类 超类class B:pass #父类 基类 超类class A_son(A,B): pass #子类 派生类class AB_son(A):pass #子类 派生类#一个类 可以被多个类继承#一个类可以继承多个父类print(A_son.__bases__) #查看类的继承__bases__ (, )print(AB_son.__bases__) #查…

在真实工作中的编程是怎么样的,与学校里有什么不同?

学校里每门编程语言课程都是上一点上不完的,实验课写的代码最长一两百行。 而在真实的工作环境中,程序员写代码是怎么样的?每天要啪啪啪手敲成千上万行代码嘛?和在学校学习时写代码有什么异同呢?/*说说我的经验*/刚进公…

聊一聊Docker与时区

前言 当我们把应用部署到容器里面之后,基本都会要和时间/时区打交道!!大部分的应用,多多少少都会有获取当前时间的操作,试想一下应用拿到的时间不对,那么业务极有可能会乱套,造成严重的损失。时…