新中新二代身份證dll調用問題: 調用這個dll時, 到這個方法: Syn_ReadMsg(nPort, 0, ref CardMsg),就報嘗試讀取或寫入受保護的內存。這通常指示其他內存已損壞 這個錯,CardMsg是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; // 照片路徑 } 原型方法: [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadMsg", CharSet = CharSet.Ansi)] public static extern int Syn_ReadMsg(int iPortID, int iIfOpen, ref IDCardData pIDCardData);
如果是vista以上系統,調試中可能也會出現此錯誤,必須編譯後用管理員模式運行。默認的普通是禁止訪問系統根目錄文件的。
ref:http://bbs.csdn.net/topics/390089291