using System;
using System.Collections.Generic;using System.Text;
using System.Runtime.InteropServices;
namespace 访客通2010版
{
    public static class Read_ID_Card_JingLun
    {
        /// <summary>
        /// 本函数用于打开串口或USB并检测读卡设备是否就绪
        /// 注:如果读卡机具连接的端口是确定的,可以直接使用相应端口号调用本函数。否则,可以采用循环查找的方式调用本函数。
        /// </summary>
        /// <param name="iPort">iPort:设置串口或USB(目前串口和USB都只支持16个,即串口1~16和USB1001-1016)</param>
        /// <returns></returns>
        [DllImport("Sdtapi.dll")]
        public static extern int InitComm(int iPort);        /// <summary>
        /// 本函数用于发现身份证卡并选择卡。
        /// 注:认证卡时,需要将身份证放置于读卡机具上方并做稍许时间的停留。如果函数返回错误表示没有发现卡或者卡停留时间太短。
        /// </summary>
        /// <returns></returns>
        [DllImport("Sdtapi.dll")]
        public static extern int Authenticate();
        /// <summary>
        /// 本函数用于读取卡中基本信息,包括文字信息与图像信息。文字信息以字符串格式输出。图象信息被解码后存为文件photo.bmp(在当前工作目录下)。
        /// </summary>
        /// <param name="Name">Name [out] 字符型指针,指向姓名信息。需要在调用时分配内存,字节数不小31。</param>
        /// <param name="Gender">Gender [out] 字符型指针,指向性别信息(男或者女)。需要在调用时分配内存,字节数不小3。</param>
        /// <param name="Folk">Folk  [out] 字符型指针,指向民族信息。需要在调用时分配内存,字节数不小10。</param>
        /// <param name="BirthDay">BirthDay [out] 字符型指针,指向出生日期信息。需要在调用时分配内存,字节数不小9,前四位为出生年,第5位到第6位是出生月,后两位是出生日,格式为:CCYYMMDD。</param>
        /// <param name="Code">Code [out] 字符型指针,指向身份证号码信息。需要在调用时分配内存,字节数不小19。</param>
        /// <param name="Address">Address [out] 字符型指针,指向地址信息。需要在调用时分配内存,字节数不小71。</param>
        /// <param name="Agency">Agency [out] 字符型指针,指向签证机关信息。需要在调用时分配内存,字节数不小31。</param>
        /// <param name="ExpireStart">ExpireStart [out] 字符型指针,指向有效期起始日期信息。需要在调用时分配内存,字节数不小9, 格式为:CCYYMMDD。</param>
        /// <param name="ExpireEnd">ExpireEnd [out] 字符型指针,指向有效期截至日期信息。需要在调用时分配内存,字节数不小9,格式为:CCYYMMDD,有效期为长期的表示为汉字“长期”。</param>
        /// <returns></returns>
        [DllImport("Sdtapi.dll")]
        public static extern int ReadBaseInfos(StringBuilder Name, StringBuilder Gender, StringBuilder Folk,
                                                    StringBuilder BirthDay, StringBuilder Code, StringBuilder Address,
                                                        StringBuilder Agency, StringBuilder ExpireStart, StringBuilder ExpireEnd);
        /// <summary>
        /// 本函数用于关闭已打开的端口,一般在调用InitComm成功并完成读卡任务后调用。
        /// 注意:如果不再使用已打开的端口,必须使用CloseComm函数关闭端口。
        /// </summary>
        /// <returns></returns>
        [DllImport("Sdtapi.dll")]
        public static extern int CloseComm();        /// <summary>
        /// 本函数用于读取卡中基本信息,包括文字信息与图像信息。文字信息已经分段解析,输出格式为单字节,且每一字段信息已经被表示为字符串。图象信息被解码后存为文件photo.bmp(在当前工作目录下)。
        /// </summary>
        /// <param name="pMsg">pMsg  [out] 无符号字符指针,指向读到的文本信息。需要在调用时分配内存,字节数不小于192。函数调用成功后,各字段的文本信息已经转换为单字节形式,并表示为字符串格式。字段意义及偏移值如下所示:</param>
        /// <param name="len">Len  [out] 整数, 返回总字符长度,可以给空值(NULL)。</param>
        /// <returns>1正确。0错误</returns>
        [DllImport("Sdtapi.dll")]
        public static extern int ReadBaseMsg(byte[] pMsg, ref int len);        /// <summary>
        /// 本函数用于读取卡中基本信息,包括文字信息与图像信息。文字信息未解析,文字信息采用GB13000的UCS-2进行存储,图象信息被解码后存为文件photo.bmp(在当前工作目录下)。
        /// </summary>
        /// <param name="pMsg">pMsg  [out] 无符号字符指针,指向读到的文本信息。需要在调用时分配内存,字节数不小于256。偏移值如下所示:</param>
        /// <param name="len">Len  [out] 整数, 返回基本信息长度。</param>
        /// <returns></returns>
        [DllImport("Sdtapi.dll")]
        public static extern int ReadBaseMsgW(byte[] pMsg, ref int len);        /// <summary>
        /// 读取SAM模块ID
        /// </summary>
        /// <param name="samid"></param>
        /// <returns></returns>
        [DllImport("Sdtapi.dll")]
        public static extern int GetSAMIDToStr(StringBuilder samid);
    }
}++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Read_ID_Card_JingLun.InitComm(Dal.Config.Read_ID_Card_ComPort);
            if (Read_ID_Card_JingLun.Authenticate() != 1)
            {
                MessageBox.Show("卡论证失败,请移开卡并重新放入!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            StringBuilder Name = new StringBuilder(31);
            StringBuilder Gender = new StringBuilder(3);
            StringBuilder Folk = new StringBuilder(10);
            StringBuilder BirthDay = new StringBuilder(9);
            StringBuilder Code = new StringBuilder(19);
            StringBuilder Address = new StringBuilder(71);
            StringBuilder Agency = new StringBuilder(31);
            StringBuilder ExpireStart = new StringBuilder(9);
            StringBuilder ExpireEnd = new StringBuilder(9);
            byte[] pMsg = new byte[256];
            string[] baseinfo = new string[9];
            char[] param = { '/0' };
            int intReadBaseInfosRet = Read_ID_Card_JingLun.ReadBaseInfos(Name, Gender, Folk, BirthDay, Code, Address, Agency, ExpireStart, ExpireEnd);
            if (intReadBaseInfosRet != 1)
            {
                MessageBox.Show("读取卡数据失败!请移开后重新放入再试!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

需要调用sdtapi.dll ,和wltrs.dll dll