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,还是出错,请高手指点 !!急 ~~
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,还是出错,请高手指点 !!急 ~~
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都初始化了吗
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
它又出这个错:警告: 非托管代码已经在 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();//有效期截至日期信息
}
一般对于CHAR * 用string,stringbulider都可以。