小编C#项目使用结构体的时候出现“System.Runtime.InteropServices.SafeArrayTypeMismatchException”错误,经过发现小编的结构体类型属性用到了字符数组类型,所以报了错误,开始小编的结构体是这样定义的,如下:
public struct FCINFTBL { public char[] htid; public char[] htdmy; public int adv; public int fileno; // 文件数量 public int filesize;// 文件总大小 public int jobcmd;// 0接收数据 //1 发送数据 public int datatype;// 数据类型 }
然后小编使用的时候这样初始化,如下所示:
//初始化并使用 FCINFTBL ftbl; //申明长度为6 ftbl.htid = new char[6]; //申明长度为2 ftbl.htdmy = new char[2]; ftbl.adv = 0; ftbl.fileno = 0; ftbl.filesize = 0; ftbl.jobcmd = 0; ftbl.datatype = 0; //使用结构体 int cin = hst_getcinffirst(ref ftbl);
乍一看是不会有问题的,但是在程序运行之后,就会报SafeArrayTypeMismatchException错误。
解决方案:
在定义struct结构体的时候,如果该属性是数组类型,需要将上方的结构体改成如下这样即可,添加注释,申明结构体的长度即可。
public struct FCINFTBL { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public char[] htid; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public char[] htdmy; public int adv; public int fileno; // 文件数量 public int filesize;// 文件总大小 public int jobcmd;// 0接收数据 //1 发送数据 public int datatype;// 数据类型 }