QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

查看: 2316|回复: 0

[C#/.NET] C# 调用动态链接库读取二代身份证信息

[复制链接]

等级头衔

积分成就    金币 : 2841
   泡泡 : 1516
   精华 : 6
   在线时间 : 1294 小时
   最后登录 : 2024-11-21

丰功伟绩

优秀达人突出贡献荣誉管理论坛元老

联系方式
发表于 2021-10-14 09:40:57 | 显示全部楼层 |阅读模式
一、概述/ y& n# E6 @6 j& R' e  o
       一般来说winform应用程序解决这个问题起来时很容易的,web应用程序就麻烦一点了。你必要有联机型居民身份证阅读器一个。3 o) {3 g* c# v' o7 ?
二、实现方式
+ t! d, L' C0 g2 e1、新建一个winform控件项目ReadCardControl,添加一个主类ReadIDCard
1 R9 B  C! _& I- H
  1. private bool  ReadIDCard()
  2.         {
  3.             try
  4.             {
  5.                 BLL.API.SynIDCardAPI.IDCardData CardMsg = new BLL.API.SynIDCardAPI.IDCardData();
  6.                 int nRet, nPort;
  7.                 byte[] pucIIN = new byte[4];
  8.                 byte[] pucSN = new byte[8];
  9.                 nPort = Convert.ToInt32(1001);
  10.                 if (BLL.API.SynIDCardAPI.Syn_OpenPort(nPort) == 0)
  11.                 {
  12.                     if (BLL.API.SynIDCardAPI.Syn_SetMaxRFByte(nPort, 80, 0) == 0)
  13.                     {
  14.                         nRet = BLL.API.SynIDCardAPI.Syn_StartFindIDCard(nPort, ref pucIIN[0], 0);
  15.                         nRet = BLL.API.SynIDCardAPI.Syn_SelectIDCard(nPort, ref pucSN[0], 0);
  16.                         nRet = BLL.API.SynIDCardAPI.Syn_ReadMsg(nPort, 0, ref CardMsg);
  17.                         if (nRet == 0)
  18.                         {
  19.                             txtAddress.Text = CardMsg.Address;
  20.                            
  21.                             txtBirthday.Text = CardMsg.Born;
  22.                             txtCerticate.Text = CardMsg.IDCardNo;
  23.                           
  24.                             txtIssuingAuthoriy.Text = CardMsg.GrantDept;
  25.                             txtNames.Text = CardMsg.Name;
  26.                             txtNation.Text = Xw.Common.Helper.NationHelper.GetNationByNO(CardMsg.Nation);
  27.                             txtSex.Text = CardMsg.Sex == "1" ? "男" : "女";
  28.                             picMan.Image = Image.FromFile(CardMsg.PhotoFileName);
  29.                             //lblMsg.Text = "读卡成功";
  30.                             return true;
  31.                         }
  32.                         else
  33.                         {
  34.                             lblMsg.Text = "请放卡: 读取身份证信息错误";
  35.                             return false;
  36.                         }
  37.                     }
  38.                 }
  39.                 else
  40.                 {
  41.                     lblMsg.Text = "打开端口失败";
  42.                     return false;
  43.                 }
  44.                 return true;
  45.             }
  46.             catch (Exception ex)
  47.             {
  48.                 Xw.Common.Helper.LogHelper.WriteErrorToLog(ex.Message);
  49.                 return false;
  50.             }
  51.         }
2、声明DllImport,调用动态链接库3 ^/ @! T) q- S9 |; T% y
  1.   public  class SynIDCardAPI
  2.     {
  3.         #region IDCardData
  4.         [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
  5.         public struct IDCardData
  6.         {
  7.             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] //结构中使用的字串,[]类似限定说明 说明此公共结构传输到非托管代码时封装定义
  8.             public string Name; //姓名   
  9.             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
  10.             public string Sex;   //性别
  11.             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
  12.             public string Nation; //名族
  13.             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]
  14.             public string Born; //出生日期
  15.             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 72)]
  16.             public string Address; //住址
  17.             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 38)]
  18.             public string IDCardNo; //身份证号
  19.             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
  20.             public string GrantDept; //发证机关
  21.             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]
  22.             public string UserLifeBegin; // 有效开始日期
  23.             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]
  24.             public string UserLifeEnd;  // 有效截止日期
  25.             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 38)]
  26.             public string reserved; // 保留
  27.             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]
  28.             public string PhotoFileName; // 照片路径
  29.         }
  30.         #endregion
  31.         #region SynIDCardAPI
  32.         /************************端口类API *************************/
  33.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetMaxRFByte", CharSet = CharSet.Ansi)]
  34.         public static extern int Syn_SetMaxRFByte(int iPort, byte ucByte, int iIfOpen);
  35.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetCOMBaud", CharSet = CharSet.Ansi)]
  36.         public static extern int Syn_GetCOMBaud(int iPort, ref uint puiBaudRate);
  37.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetCOMBaud", CharSet = CharSet.Ansi)]
  38.         public static extern int Syn_SetCOMBaud(int iPort, uint uiCurrBaud, uint uiSetBaud);
  39.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_OpenPort", CharSet = CharSet.Ansi)]
  40.         public static extern int Syn_OpenPort(int iPort);
  41.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ClosePort", CharSet = CharSet.Ansi)]
  42.         public static extern int Syn_ClosePort(int iPort);
  43.         /**************************SAM类函数 **************************/
  44.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ResetSAM", CharSet = CharSet.Ansi)]
  45.         public static extern int Syn_ResetSAM(int iPort, int iIfOpen);
  46.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMStatus", CharSet = CharSet.Ansi)]
  47.         public static extern int Syn_GetSAMStatus(int iPort, int iIfOpen);
  48.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMID", CharSet = CharSet.Ansi)]
  49.         public static extern int Syn_GetSAMID(int iPort, ref byte pucSAMID, int iIfOpen);
  50.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMIDToStr", CharSet = CharSet.Ansi)]
  51.         public static extern int Syn_GetSAMIDToStr(int iPort, ref byte pcSAMID, int iIfOpen);
  52.         /*************************身份证卡类函数 ***************************/
  53.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_StartFindIDCard", CharSet = CharSet.Ansi)]
  54.         public static extern int Syn_StartFindIDCard(int iPort, ref byte pucIIN, int iIfOpen);
  55.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SelectIDCard", CharSet = CharSet.Ansi)]
  56.         public static extern int Syn_SelectIDCard(int iPort, ref byte pucSN, int iIfOpen);
  57.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadBaseMsg", CharSet = CharSet.Ansi)]
  58.         public static extern int Syn_ReadBaseMsg(int iPort, ref byte pucCHMsg, ref uint puiCHMsgLen, ref byte pucPHMsg, ref uint puiPHMsgLen, int iIfOpen);
  59.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadIINSNDN", CharSet = CharSet.Ansi)]
  60.         public static extern int Syn_ReadIINSNDN(int iPort, ref byte pucIINSNDN, int iIfOpen);
  61.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadBaseMsgToFile", CharSet = CharSet.Ansi)]
  62.         public static extern int Syn_ReadBaseMsgToFile(int iPort, ref byte pcCHMsgFileName, ref uint puiCHMsgFileLen, ref byte pcPHMsgFileName, ref uint puiPHMsgFileLen, int iIfOpen);
  63.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadIINSNDNToASCII", CharSet = CharSet.Ansi)]
  64.         public static extern int Syn_ReadIINSNDNToASCII(int iPort, ref byte pucIINSNDN, int iIfOpen);
  65.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadNewAppMsg", CharSet = CharSet.Ansi)]
  66.         public static extern int Syn_ReadNewAppMsg(int iPort, ref byte pucAppMsg, ref uint puiAppMsgLen, int iIfOpen);
  67.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetBmp", CharSet = CharSet.Ansi)]
  68.         public static extern int Syn_GetBmp(int iPort, ref byte Wlt_File);
  69.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadMsg", CharSet = CharSet.Ansi)]
  70.         public static extern int Syn_ReadMsg(int iPortID, int iIfOpen, ref IDCardData pIDCardData);
  71.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_FindReader", CharSet = CharSet.Ansi)]
  72.         public static extern int Syn_FindReader();
  73.         /***********************设置附加功能函数 ************************/
  74.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoPath", CharSet = CharSet.Ansi)]
  75.         public static extern int Syn_SetPhotoPath(int iOption, ref byte cPhotoPath);
  76.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoType", CharSet = CharSet.Ansi)]
  77.         public static extern int Syn_SetPhotoType(int iType);
  78.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoName", CharSet = CharSet.Ansi)]
  79.         public static extern int Syn_SetPhotoName(int iType);
  80.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetSexType", CharSet = CharSet.Ansi)]
  81.         public static extern int Syn_SetSexType(int iType);
  82.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetNationType", CharSet = CharSet.Ansi)]
  83.         public static extern int Syn_SetNationType(int iType);
  84.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetBornType", CharSet = CharSet.Ansi)]
  85.         public static extern int Syn_SetBornType(int iType);
  86.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetUserLifeBType", CharSet = CharSet.Ansi)]
  87.         public static extern int Syn_SetUserLifeBType(int iType);
  88.         [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetUserLifeEType", CharSet = CharSet.Ansi)]
  89.         public static extern int Syn_SetUserLifeEType(int iType, int iOption);
  90.         #endregion
  91.     }
3、读取显示相关的信息
  1. txtAddress.Text = CardMsg.Address;
  2.                            
  3.                             txtBirthday.Text = CardMsg.Born;
  4.                             txtCerticate.Text = CardMsg.IDCardNo;
  5.                           
  6.                             txtIssuingAuthoriy.Text = CardMsg.GrantDept;
  7.                             txtNames.Text = CardMsg.Name;
  8.                             txtNation.Text = Xw.Common.Helper.NationHelper.GetNationByNO(CardMsg.Nation);
  9.                             txtSex.Text = CardMsg.Sex == "1" ? "男" : "女";
  10.                             picMan.Image = Image.FromFile(CardMsg.PhotoFileName);
  11.                             //lblMsg.Text = "读卡成功";
  12.                             return true;
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|paopaomj.COM ( 渝ICP备18007172号|渝公网安备50010502503914号 )

GMT+8, 2024-11-21 22:51

Powered by paopaomj X3.5 © 2016-2025 sitemap

快速回复 返回顶部 返回列表