C#调用C++ dll 参数是结构体数组,参数调用有关问题 求大神支招

C#调用C++ dll 参数是结构体数组,参数调用问题 求大神支招
#define RTDB_TAGNAME_LENGTH 48 //测点点名最大长度

//************************************
//给已有记录点插入数据结构体
//************************************
typedef struct InsertData_struct{
int            type;                     //为0则为开关量,为1则为摸拟量
int            status;                                          //写入点记录的状态
double    value;                                          //写入点记录的值
long         time;                     //写入点记录的时间,秒
char         pointName[RTDB_TAGNAME_LENGTH]; //写入点的完整点名
}InsertData;



//************************************
//测点信息结构体
//************************************
//**************************************
//查询历史记录请求包的结构
//**************************************
typedef struct ReadHiDataRequest_struct{
long stTime; //查询点记录的开始时间,秒
long enTime; //查询点记录的结束时间,秒
long tPeriod;                      //查询点值的时间间隔,秒
int     reqType; //查询的数据类型(原始=0,最大=1,最小=2,平均=3,快照=4)
char pointName[RTDB_TAGNAME_LENGTH];     //请求的完整点名
}ReadHiDataRequest;

//查询单个测点在给定的开始时间和结束时间之间的原始值

//查询单个测点在给定的开始时间和结束时间之间的原始值
typedef  int (*pGetRawDataByTagName)(ReadHiDataRequest * pReadHiDataRequest, TagData * & pTagData,long * nCount);
pGetRawDataByTagName m_GetRawDataByTagName;

用C++调用如下 能获取到数据

void testGetRawDataByTagName()
{
long nCount = 0;
nCount = RTDB_MAX_DATACOUNT;
ReadHiDataRequest req;
TagData *tagDatas = NULL;

printf("\n开始输入测点");
printf("\nEnter tagname: ");
gets(req.pointName);
CTime  ctime = CTime::GetCurrentTime();
time_t nowTime= ctime.GetTime();
req.stTime = nowTime-3600;//backSecond1;
req.enTime = nowTime;//-backSecond2;
req.tPeriod = 0;//nPeriod;
req.reqType =0;

int nRet = m_GetRawDataByTagName(&req,tagDatas,&nCount);

if (nRet == 0)
{
printf("获取测点原始数据数据成功!测点名 = %s,原始值数量%d\n",req.pointName,nCount);
for (int i = 0; i < nCount ; i++)
{
CTime ctime;
ctime = CTime(tagDatas[i].time);
printf("GetRawDataByTagName tagDatas[%d] Vlaue = %f time = %d-%d-%d %d:%d:%d status = %d\n"
,i, tagDatas[i].value,ctime.GetYear(),ctime.GetMonth(),ctime.GetDay(),ctime.GetHour(),ctime.GetMinute(),ctime.GetSecond(),
tagDatas[i].status);
}
}
else
{
printf("获取测点原始数据数据始值失败!\n");

}
m_RTDBFreePointer(tagDatas);

}


现在我要改成用C#调用;我自己写了种方法但是调用不出来,请大家帮忙看看是什么原因,我自己觉得还是 结构体参数传递不正确。返回的错误是一个接口内部错误。看不出来到底错在哪里。

          [DllImport("RTDBInterface.dll", EntryPoint = "GetRawDataByTagName")]
        private static extern int GetRawDataByTagName1(ReadHiDataRequest preq, ref IntPtr ptrReslut, ref long nCount);
 long nCount = 0;
            nCount = RTDB_MAX_DATACOUNT;

            ReadHiDataRequest req = new ReadHiDataRequest();
            TagData[] tagDatas = new TagData[nCount];
            for (int i = 0; i < nCount; i++)
            {
                tagDatas[i] = new TagData ();

            }
            IntPtr ptrRsult = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(TagData)) * Convert.ToInt32(nCount));

            DateTime dtBeginTime = this.dtpBeginTime.Value;
            DateTime dtEndTime = this.dtpEndTime.Value;