c#调用dll出现错误:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。这是DLL的一个方法
int ReadBaseInfos( char * Name, char * Gender, char * Folk,char *BirthDay, char * Code, char *Address,
char *Agency, char * ExpireStart,char* ExpireEnd)
我给他传的参数是StringBuilder 类型
[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); 运行后出错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
我查了一下是参数问题,后来我把类型改为char,还是出错,请高手指点 !!急 ~~

解决方案 »

  1.   

    [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都初始化了吗
      

  2.   

    我把这些参数放在一个类里
     public class Card
        {
            public StringBuilder name; //姓名信息
            public StringBuilder gender;  //性别
            public StringBuilder folk;  //民族   
            public StringBuilder birthday; //出生日期
            public StringBuilder code;//身份证号码信息
            public StringBuilder address; //向地址信息 
            public StringBuilder agency;//签证机关信息
            public StringBuilder expireStart;  //有效期起始日期信息
            public StringBuilder expireEnd;//有效期截至日期信息
    }
    传的参数:Card card = new Card();
    card.name
      

  3.   

    我现在把这个类改了
    它又出这个错:警告: 非托管代码已经在 StringBuilder 缓冲区溢出。进程可能变得不稳定。在进行封送处理之前,未给 StringBuilder 分配足够的容量。
     public class Card
        {
            public StringBuilder name = new StringBuilder(); //姓名信息
            public StringBuilder gender = new StringBuilder();  //性别
            public StringBuilder folk = new StringBuilder();  //民族   
            public StringBuilder birthday = new StringBuilder(); //出生日期
            public StringBuilder code = new StringBuilder();//身份证号码信息
            public StringBuilder address = new StringBuilder(); //向地址信息 
            public StringBuilder agency = new StringBuilder();//签证机关信息
            public StringBuilder expireStart = new StringBuilder();  //有效期起始日期信息
            public StringBuilder expireEnd = new StringBuilder();//有效期截至日期信息
    }
      

  4.   

    DLL里面的char就在C#中可以用Byte来处理 stirng.Tocharray() 返回的结果用COde类来解析就可以了。
      

  5.   

    多尝试下
    一般对于CHAR *  用string,stringbulider都可以。