C# 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。这是一个接口的方法int ReadBaseInfos( char *
C# 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
这是一个接口的方法
int ReadBaseInfos( char * Name, char * Gender, char * Folk,
char *BirthDay, char * Code, char * Address,char *Agency, char * ExpireStart,char* ExpireEnd)
我在C#中调用,ReadBaseInfos方法第一次调用正常,第二次调用提示"尝试读取或写入受保护的内存。这通常指示其他内存已损坏。"
[DllImport("Sdtapi.dll")]
private static extern int ReadBaseInfos(StringBuilder Name, StringBuilder Gender, StringBuilder Folk, StringBuilder BirthDay, StringBuilder Code, StringBuilder Address, StringBuilder Agency, StringBuilder ExpireStart, StringBuilder ExpireEnd);
谁能帮解一下~!
[解决办法]http://www.cnblogs.com/yiki/archive/2008/10/29/1321848.html
数据类型问题,
如果第一次调用正常,第二次调用失败检查是不是open 之后没有close (个人判断)
[解决办法]数据类型没有匹配吧
[解决办法]保证每个StringBuilder 的实例的Capacity足够的大
第一次调用成功后看下每个StringBuilder 的Capacity是否有变小,如果有变小就调整到足够大
[解决办法][DllImport("sdtapi.dll", EntryPoint = "ReadBaseInfos",//读取卡中基本信息
CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int ReadBaseInfos(StringBuilder Name, StringBuilder Gender, StringBuilder Folk, StringBuilder BirthDay,
StringBuilder Code, StringBuilder Address, StringBuilder Agency, StringBuilder ExpireStart, StringBuilder ExpireEnd);
设置StringBuilder 的大小
[解决办法]StringBuilder的实例Capacity的尽量设大点,可以都改为256,因为调用完ReadBaseInfos之后用StringBuilder的Length属性确定你读到的内容长度就可以了,排除Capacity过小造成的问题
另外StringBuilder的实例初始化全部都放到while循环外面,只new一次
[解决办法]传入写缓存用StringBuilder是对的,楼主第一次正确,说明不是参数类型的问题
建议:
1, 适当增大StringBuilder容量
2,不要在循环中每次New,在外面New好,循环内使用StringBuilder.Remove(0,sb.Length)清空内容即可