C#调用c++中的dll出现的奇怪问题,请大家来帮帮忙!
有这样一个C++的Dll方法
typedef struct//结构体定义
{
unsigned int checkvalue;
unsigned int total_num
unsigned char bar_code[21];
unsigned char spec[6][22];
unsigned char name[31];
unsigned char last_in_datetime[7];
unsigned char last_out_datetime[7];
}TGOODS_INFO_RECORD;
//调用方法
RETVALUE ExportGoodsRecord(unsigned char TransType, int *recordNum, unsigned int recordoffset, unsigned char *recordsBytes, unsigned int *recordslen, unsigned int *recordCount);
在C#中我是这样调用的
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi,Pack=1)]//定义结构体对应
public struct TGOODS_INFO_RECORD
{
public uint checkvalue; // 4字节
public uint total_num; // 4字节
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 21)]
public char[] bar_code; // 21字节
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 31)]
public char[] name; // 32字节
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6 * 22)]
public char[] spec; //132
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
public char[] last_in_datetime; // 7字节
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
public char[] last_out_datetime; // 7字节
//共206字节
};
[DllImport("ImExAPI.dll", EntryPoint = "ExportGoodsRecord")]
private static extern RETVALUE ExportGoodsRecord(byte TransType, ref int recordNum, uint recordoffset, IntPtr recordsBytes, ref int recordslen, ref uint recordCount);
private void button3_Click(object sender, EventArgs e)
{
int recordNum=4;//一次读取4条记录、
uint recordoffset;//存储读取记录的偏移
int recordslen;//数据记录长度
uint recordCount;//存储记录总数
int j;
bool bSuccess=true;
TGOODS_INFO_RECORD[] goods_info_record = new TGOODS_INFO_RECORD[4];//定义结构体数据,允许一次导出4条商品信息记录
for (int a = 0; a < goods_info_record.Length; a++)
{
goods_info_record[a] = new TGOODS_INFO_RECORD();
}
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(TGOODS_INFO_RECORD)));
recordoffset=0;
recordCount=4;//假定总记录数为一次能读到的记录数据数
while(recordoffset<recordCount)
{
for (int a = 0; a < goods_info_record.Length; a++)
{
goods_info_record[a] = new TGOODS_INFO_RECORD();
}
recordslen = Marshal.SizeOf(typeof(TGOODS_INFO_RECORD)) * recordNum;
if (ExportGoodsRecord(0x01, ref recordNum, recordoffset, ptr, ref recordslen, ref recordCount) != RETVALUE.TRANS_SUCCESS)
{
bSuccess = false;
break;
}
for (j = 0; j < recordNum; j++)
{
goods_info_record[j] = (TGOODS_INFO_RECORD)Marshal.PtrToStructure((IntPtr)((UInt32)ptr + j * Marshal.SizeOf(typeof(TGOODS_INFO_RECORD))), typeof(TGOODS_INFO_RECORD));
string sa = new string(goods_info_record[j].bar_code);
textBox1.Text += "\r\n数据为" + sa;
}
recordoffset += (uint)recordNum;//此处需要判断返回数据的长度与需要读取的数据长度是否匹配,如果不匹配,则判断实际读到的记录数为多少,然后改变其偏移位置
}
}
数据已经可以读出了,但是在程序关闭时报出了程序内存无法"read"的问题,各位大大有遇见的么,是我的调用函数有问题么??