C#调用C写的DLL,在C中的调用方法如下:(其中XUSTS,XTSBLOCK,ERRBLOCK为结构体,已定义)
#define MAXOCCS 10;
#define DTYPXTIM -5;
#define DTYPDUBL -6;
#define H21_GET_ACTUALS 2;
long         id; 
long         fts[2] = { 0x241A0000, 0x24190000 }; 
short        data_ts[2] = { DTYPXTIM, DTYPDUBL }; 
XTSBLOCK  times[MAXOCCS]; 
double      vals[MAXOCCS]; 
XUSTS         keytimes[MAXOCCS]; 
short        keylevels[MAXOCCS]; 
void         *ptdatas[2] = { (void *)times, (void *)vals }; 
XUSTS      xusts_old; 
XUSTS      xusts_new; 
long         occs_ok; 
short        fts_ok; 
ERRBLOCK  err; 
RHIS21DATA ( H21_GET_ACTUALS, 0,  0, id, fts[0] + 1, &xusts_old,  
&xusts_new, 2,fts,     data_ts, (long)MAXOCCS,  keylevels, keytimes,  
ptdatas,&occs_ok,&fts_ok,&err); 
其中里面ptdatas在C#里面应该怎么定义?以下是我的定义方式        //读历史值
        [DllImport("infoplus21_api.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
        public static extern void RHIS21DATA(int mode,int step,int outSiders,int tagId,int propertyId,XUSTS startTime,XUSTS endTime,int numfts,int[] fts,int[] datatypes,int maxoccus,out int[] keylevels,out XUSTS[] keyTimes,out IntPtr[] ptdatas, out int occsok,out int ftsok,out ERRBLOCK errMsg);求助高手

解决方案 »

  1.   

    可以定义一下指针,System.IntPtr 类型的,需要using System.Runtime.InteropServices;这个类型就是一个指针,还可以用Marshal.Copy()方法把这个指针的内容赋给一个托管类型,也可以用它把一个托管类型赋给一个指针.
      

  2.   

      我是这样定义指针类型的         //设定返回值
                float[] vals = new float[MaxOcc];
                XUSTS[] times = new XUSTS[MaxOcc];
                IntPtr valsptr = Marshal.AllocHGlobal(Marshal.SizeOf(vals));
                IntPtr timesptr = Marshal.AllocHGlobal(Marshal.SizeOf(times));

                IntPtr[] point = new IntPtr[] {valsptr, timesptr};执行到红色部分就报错:
    类型“System.Single[]”不能作为非托管结构进行封送处理;无法计算有意义的大小或偏移量。
      

  3.   


    {
        XTSBLOCK[] times = new XTSBLOCK[10];
        double[] values = new double[10];
        //...    GCHandle hTimes = GCHandle.Alloc(times, GCHandleType.Pinned);
        GCHandle hValues = GCHandle.Alloc(values, GCHandleType.Pinned);
        IntPtr[] ptdatas = { hTimes.AddrOfPinnedObject(), hValues.AddrOfPinnedObject() };
        {
            RHIS21DATA(..., ptdatas, ...);
        }
        hTimes.Free();
        hValues.Free();
    }
    [DllImport(...)]
    public static extern void RHIS21DATA(..., IntPtr[] ptdatas, ...);