有没有做过二代身份证阅读器的朋友?我用的是华视电子的。dll不能引用啊。为什么?

ay_changyafei 2011-09-23 01:03:55
细细看了一遍华视电子的SDK使用手册。。
dll无法添加引用到ASP.NET中。。C#的winform同样也是加不进去。。
有能解决一下的吗?怎么添加引用进去?
我目前的方法是直接把dll文件粘贴到bin目录下,然后自己在类里面用DllImport调用。。

有谁用过华视电子二代身份证阅读器的朋友可以加我QQ聊一下。最好能做到指导性的。。谢谢了
QQ:450238606
...全文
1080 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ay_changyafei 2011-09-23
  • 打赏
  • 举报
回复
8楼。。 我太谢谢你了。。。

我就没考虑到这里。。 我一直在想是不是参数有问题。。。

谢谢。。 谢谢8楼
风之影子 2011-09-23
  • 打赏
  • 举报
回复
把DLL放在system32下即可。
ay_changyafei 2011-09-23
  • 打赏
  • 举报
回复
按照5楼的方法。。 调用[DllImport("termb.dll")] public static extern int CVR_InitComm(int Port); 调用这个方法时,抛出异常:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

这一步若是悲剧了。。 就打不开读卡器连接了。。
调用如下:
[DllImport("termb.dll")]
public static extern int CVR_InitComm(int Port);
页面代码:
int iRetUSB = 0;
int iPort;
int iRetCOM = 0;
for (iPort = 1001; iPort <= 1016; iPort++)
{
iRetUSB = Module_DLL.CVR_InitComm(iPort);
if (iRetUSB == 1)
{
break;
}
}

for (iPort = 1; iPort <= 4; iPort++)
{
iRetCOM = Module_DLL.CVR_InitComm(iPort);
if (iRetCOM == 1)
{
break;
}
}

if ((iRetCOM == 1) || (iRetUSB == 1))
{
//MessageBox.Show("读卡器初始化成功!");
Response.Write("<script>alert('yes')</script>");
}
else
{
// MessageBox.Show("未连接读卡器!");
Response.Write("<script>alert('no')</script>");
}
小志 2011-09-23
  • 打赏
  • 举报
回复
using DLAFMS.SysCommon.MsgBox;//显示对话框
using DLAFMS.SysCommon;//错误日志处理
using DLAFMS.SysCommon.Config;//读取配置文件
这三个命名空间是我的业务处理类
调用:
private IdentityCardProviderImp icp = new IdentityCardProviderImp();

private void btn_Read_Click(object sender, EventArgs e) {
icp.ReadIdCardCompleteEvent -= new ReadIdCardCompleteDelegate(icp_ReadIdCardCompleteEvent);
icp.ReadIdCardCompleteEvent += new ReadIdCardCompleteDelegate(icp_ReadIdCardCompleteEvent);
icp.ReadIdCard();
}

private void icp_ReadIdCardCompleteEvent(object sender, IdentityCardInfo cardInfo) {
//该事件取得身份证各项信息
txt_UserName.Text = cardInfo.Name;
txt_IdentityNo.Text = cardInfo.CardId;
txt_Sex.Text = MapEnumData.GetDisplayValue(cardInfo.Sex, EnumName.SexType);
txt_Birthday.Text = cardInfo.Birthday;
txt_HomeAddress.Text = cardInfo.Address;
}
小志 2011-09-23
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;

using DLAFMS.SysCommon.MsgBox;
using DLAFMS.SysCommon;
using DLAFMS.SysCommon.Config;

namespace DLAFMS.MIC {
public class IdentityCardProviderImp {
private int portId;//端口号
private event ReadIdCardCompleteDelegate readICCardCompleteEvent;
public event ReadIdCardCompleteDelegate ReadIdCardCompleteEvent {
add {
readICCardCompleteEvent += value;
}

remove {
readICCardCompleteEvent -= value;
}
}

private void DeleteFile() {
try {
FileInfo file = new FileInfo("wz.txt");
if (file.Exists) {
file.Attributes = FileAttributes.Normal;
file.Delete();
}

file = new FileInfo("zp.bmp");
if (file.Exists) {
file.Attributes = FileAttributes.Normal;
file.Delete();
}

file = new FileInfo("xp.wlt");
if (file.Exists) {
file.Attributes = FileAttributes.Normal;
file.Delete();
}
} catch (Exception ex) {
Global.mainLog.Error("删除文件出错", ex);
}
}

public void OnReadICCardComplete(IdentityCardInfo cardInfo) {
if (null != readICCardCompleteEvent) {
readICCardCompleteEvent(this, cardInfo);
DeleteFile();
}
}

/// <summary>
/// 读身份证
/// </summary>
/// <returns>是否成功,身份证信息通过事件传递</returns>
public bool ReadIdCard() {
try {
bool usbPort = false;
int tempReturn = 0;

IdentityCardInfo cardInfo = new IdentityCardInfo();
//检测usb口的机具连接,必须先检测usb
for (int port = 1001; port <= 1016; port++) {
tempReturn = CVR_InitComm(port);
if (tempReturn == 1) {
portId = port;
usbPort = true;
break;
}
}
//检测串口的机具连接
if (!usbPort) {
for (int port = 1; port <= 16; port++) {
tempReturn = CVR_InitComm(port);
if (tempReturn == 1) {
portId = port;
usbPort = false;
break;
}
}
}

if (tempReturn != 1) {
DLAFMSMessageBox.ShowInfoMessageBox(null, "端口打开失败,请检测相应的端口或者重新连接读卡器!", false);
return false;
}

tempReturn = CVR_Authenticate();
if (tempReturn != 1) {
DLAFMSMessageBox.ShowInfoMessageBox(null, "身份证验证失败,请重新放卡!", false);
return false;
}

DeleteFile();

tempReturn = CVR_Read_Content(1);
if (tempReturn != 1) {
tempReturn = CVR_CloseComm();
DLAFMSMessageBox.ShowInfoMessageBox(null, "读身份证信息失败!", false);
return false;
}

tempReturn = CVR_CloseComm();

FileInfo f = new FileInfo("wz.txt");
FileStream fs = f.OpenRead();
byte[] bt = new byte[fs.Length];
fs.Read(bt, 0, (int)fs.Length);
fs.Close();

string str = UnicodeEncoding.Unicode.GetString(bt);
cardInfo.Name = UnicodeEncoding.Unicode.GetString(bt, 0, 30).Trim();
cardInfo.Sex = UnicodeEncoding.Unicode.GetString(bt, 30, 2).Trim();
cardInfo.Nation = UnicodeEncoding.Unicode.GetString(bt, 32, 4).Trim();
cardInfo.Birthday = UnicodeEncoding.Unicode.GetString(bt, 36, 16).Trim();
cardInfo.Address = UnicodeEncoding.Unicode.GetString(bt, 52, 70).Trim();
cardInfo.CardId = UnicodeEncoding.Unicode.GetString(bt, 122, 36).Trim();
cardInfo.Organ = UnicodeEncoding.Unicode.GetString(bt, 158, 30).Trim();
string strLongTerm = UnicodeEncoding.Unicode.GetString(bt, 188, bt.GetLength(0) - 188).Trim();
StringBuilder sb = new StringBuilder();
sb.Append(strLongTerm.Substring(0, 4)).Append(".").Append(strLongTerm.Substring(4, 2))
.Append(".").Append(strLongTerm.Substring(6,2)).Append("-");
strLongTerm = strLongTerm.Substring(8);
string longTerm = ConfigSettings.GetAttributeString("LONGTERM");

if (strLongTerm.Trim().Equals(longTerm)) {//身份证有效期:长期
sb.Append(strLongTerm);
} else {
sb.Append(strLongTerm.Substring(0, 4)).Append(".").Append(strLongTerm.Substring(4, 2))
.Append(".").Append(strLongTerm.Substring(6, 2));
}
cardInfo.ValidDate = sb.ToString();

FileInfo file = new FileInfo("zp.bmp");
if (file.Exists) {
Image img = Image.FromFile("zp.bmp");
MemoryStream ms = new MemoryStream();
img.Save(ms, ImageFormat.Jpeg);
cardInfo.ImageByte = ms.ToArray();
ms.Close();
img.Dispose();
}

OnReadICCardComplete(cardInfo);

return true;
} catch (Exception ex) {
Global.mainLog.Error("读取身份证信息出错", ex);
return false;
}
}

#region 华视电子二代身份证读取有关函数
/// <summary>
/// 本函数用于PC与华视电子第二代居民身份证阅读器的连接。
/// </summary>
/// <param name="Port">
/// 连接串口或USB口
/// 值 意义
/// 1 串口1
/// 2 串口2
/// 3 串口3
/// 4 串口4
/// 1001 USB口1
/// 1002 USB口2
/// 1003 USB口3
/// 1004 USB口4
///</param>
/// <returns>
/// 值 意义
/// 1 正确
/// 0 错误
/// </returns>
[DllImport(@"termb.dll")]
public static extern int CVR_InitComm(int Port);

/// <summary>
/// 本函数用于关闭PC到阅读器的连接。
/// </summary>
/// <returns>
/// 值 意义
/// 1 正确
/// 0 错误
/// </returns>
[DllImport(@"termb.dll")]
public static extern int CVR_CloseComm();

/// <summary>
/// 本函数用于读卡器和卡片之间的合法身份确认。
/// 注意:若卡片放置后发生认证错误时,应移走卡片重新放置。
/// </summary>
/// <returns>
/// 值 意义 说明
/// 1 正确 卡片正确放置时
/// 0 错误 未放卡或卡片放置不正确时
/// </returns>
[DllImport(@"termb.dll")]
public static extern int CVR_Authenticate();

/// <summary>
/// 本函数用于通过阅读器从第二代居民身份证中读取相应信息。
/// </summary>
/// <param name="Active">
/// 读取信息类型
/// Active 意义 说明
/// 1 读基本信息 生成文字WZ.TXT、相片数据XP.WLT和相片ZP.BMP(解码)
/// 2 读基本信息 生成文字WZ.TXT和相片数据XP.WLT
/// 3 读最新住址信息 生成最新住址NEWADD.TXT(卡无最新地址则生成空文件)
/// 4 读基本信息 生成WZ.TXT(解码),相片ZP.BMP(解码)
/// 5 读芯片管理号 芯片管理号IINSNDN.bin
/// 6 读基本信息 以设备唯一标志号,生成文字WZ.TXT(解码),相片XP.BMP(解码)(用于终端网络环境)
/// </param>
/// <returns>
/// 返回值 意义
/// 1 正确
/// 0 错误
/// </returns>
[DllImport(@"termb.dll")]
public static extern int CVR_Read_Content(int Active);

/// <summary>
/// 本函数用于打开/关闭射频。阅读器在不读卡时,如果射频对其它的电子产品有干扰的话,
/// 可以选择关闭射频,当需要读卡时,再打开射频。该函数只在当连接到串行接口的阅读器时,
/// 调用有效。如不调用此函数时,射频一直处于打开状态。
/// 注:当 CVR_InitComm函数调用成功后,该函数有效。
/// </summary>
/// <param name="mode">
///MODE 意义
/// 0 关闭射频
/// 1 打开射频
/// </param>
/// <returns>
/// 返回值 意义
/// 1 正确
/// 0 错误
/// </returns>
[DllImport(@"termb.dll")]
public static extern int CVR_Ant(int mode);
#endregion
}

public delegate void ReadIdCardCompleteDelegate(object sender, IdentityCardInfo cardInfo);
}
小志 2011-09-23
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Text;

namespace DLAFMS.MIC {
public class IdentityCardInfo {
public IdentityCardInfo() { }

private string name;

/// <summary>
/// 姓名
/// </summary>
public string Name {
get { return name; }
set { name = value; }
}

private string cardId;

/// <summary>
/// 身份证号码
/// </summary>
public string CardId {
get { return cardId; }
set { cardId = value; }
}

private string address;

/// <summary>
/// 住址
/// </summary>
public string Address {
get { return address; }
set { address = value; }
}

private string birthday;

/// <summary>
/// 出生日期
/// </summary>
public string Birthday {
get { return birthday; }
set { birthday = value; }
}

private string sex;

/// <summary>
/// 性别
/// </summary>
public string Sex {
get { return sex; }
set { sex = value; }
}

private string nation;

/// <summary>
/// 民族
/// </summary>
public string Nation {
get { return nation; }
set { nation = value; }
}

private string organ;

/// <summary>
/// 发证机关
/// </summary>
public string Organ {
get { return organ; }
set { organ = value; }
}

private string validDate;

/// <summary>
/// 有郊期限
/// </summary>
public string ValidDate {
get { return validDate; }
set { validDate = value; }
}

private byte[] imageByte;

/// <summary>
/// 图像
/// </summary>
public byte[] ImageByte {
get { return imageByte; }
set { imageByte = value; }
}
}
}
cjh200102 2011-09-23
  • 打赏
  • 举报
回复
GOOD
心灵彩虹 2011-09-23
  • 打赏
  • 举报
回复
天祈 2011-09-23
  • 打赏
  • 举报
回复
C#调用SDK!本来就i不能直接引用,用DllImport再此封装!

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧