首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C# 尝试读取或写下受保护的内存。这通常指示其他内存已损坏

2013-08-04 
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 的大小
[解决办法]
引用:
C# code

while (RunScan)
{
  try


  {
    Name = new StringBuilder(31);
    Gender = new StringBuilder(3);
    Folk = new StringBuilder(10);
    BirthDay = new StringBuilder(9);
    Code = ne……



StringBuilder的实例Capacity的尽量设大点,可以都改为256,因为调用完ReadBaseInfos之后用StringBuilder的Length属性确定你读到的内容长度就可以了,排除Capacity过小造成的问题

另外StringBuilder的实例初始化全部都放到while循环外面,只new一次
[解决办法]
传入写缓存用StringBuilder是对的,楼主第一次正确,说明不是参数类型的问题
建议:
1, 适当增大StringBuilder容量
2,不要在循环中每次New,在外面New好,循环内使用StringBuilder.Remove(0,sb.Length)清空内容即可

热点排行