小弟问题如下:C++里:
//定义CAN信息帧的数据类型。
typedef  struct  _VCI_CAN_OBJ{
UINT ID;
UINT TimeStamp;
BYTE TimeFlag;
BYTE SendType;
BYTE RemoteFlag;//是否是远程帧
BYTE ExternFlag;//是否是扩展帧
BYTE DataLen;
BYTE Data[8];
BYTE Reserved[3];
}VCI_CAN_OBJ,*PVCI_CAN_OBJ;//数据发送
ULONG SenddataCan(PVCI_CAN_OBJ pSend,ULONG Len)//SendData请问在C#里,如何定义和C++相同的结构体VCI_CAN_OBJ,而后定义一个结构体指针传递给数据发送函数SenddataCan.
结构体内含指定大小的byte数组,C#如何在结构体内定义该数组.解决问题者,马上给分!!!!!!!!!!!

解决方案 »

  1.   

    定义一个结构
    public struct VCI_CAN_OBJ
    {
      变量
      byte[] aa=new byte[100];
    }
    定义一个结构体的变量
    VCI_CAN_OBJ  vciobj;
      

  2.   

    SenddataCan(VCI_CAN_OBJ  vciobj,....)
      

  3.   

    如果需要让结构以指针的方式传递,请使用IntPtr。
      

  4.   

    cooolchen 给的答案错误哈,C#结构体里面根本不能有实例字段初始值 byte[] aa=new byte[100]; 错误的!!
    期待测试过的高人.
      

  5.   

    public struct  _VCI_CAN_OBJ{ 
    uint ID; 
    uint TimeStamp; 
    byte TimeFlag; 
    byte SendType; 
    byte RemoteFlag;//是否是远程帧 
    byte ExternFlag;//是否是扩展帧 
    byte DataLen; 
    byte Data[8]; 
    byte Reserved[3]; 
    };
    因为C#中没有指针,所以需要用其他的类型转换,可以用byte【】数组,也可以用System.Int32,还可以自己定义一个结构来转换
    ulong SenddataCan(byte []pSend,ULONG Len),需要自己写程序转换到数组中来,
    ulong SenddataCan(System.Int32 pSend,ULONG Len),
    最后一种我也只是在网上看到过,具体怎么实现,还没试过
      

  6.   

    public struct  _VCI_CAN_OBJ{ 
    uint ID; 
    uint TimeStamp; 
    byte TimeFlag; 
    byte SendType; 
    byte RemoteFlag;//是否是远程帧 
    byte ExternFlag;//是否是扩展帧 
    byte DataLen; 
    byte []Data; 
    byte []Reserved; 
    }; 
    因为C#中没有指针,所以需要用其他的类型转换,可以用byte【】数组,也可以用System.Int32,还可以自己定义一个结构来转换 
    ulong SenddataCan(byte []pSend,ULONG Len),需要自己写程序转换到数组中来, 
    ulong SenddataCan(System.Int32 pSend,ULONG Len), 
    最后一种我也只是在网上看到过,具体怎么实现,还没试过,楼主可以去试试
      

  7.   

    SenddataCan 传递参数只是传递结构体,并不需要转换到数组.zhirom 给的答案也未在结构体内给定两个数组的大小.
      

  8.   


    那在Struct 里面就不要new byte[100]; 
    直接就 byte[] aa;//只声明byte型的数组。用的时候再new byte[];Public Struct VCI_CAN_OBJ
    {
      public byte[] aa;
    }VCI_CAN_OBJ  vobj;
    bobj.aa = new byte[n...];
      

  9.   

    public struct ImageDataMsg
    {
            public char DataType;
    public int Srv_index;
            public char ConvertType;
            //这个个地方要指定长度,这样就可以的德奥结构体的正确长度了
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
    public int[] VecLayer;//需要那几个图层。
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
            public int[] GridLayer;//需要那几个栅格图层
    public int Scale_index;//需要的是那个比例尺的图像
    public int x_pos;
    public int y_pos;
            public int ClientArea_x;
            public int ClientArea_y;
    }
    //使用这个方法将你的结构体转化为bytes数组
    public static byte[] Struct2Bytes(ImageDataMsg  obj)
    {
          int size = Marshal.SizeOf(obj);
          byte[] bytes = new byte[size];
          try
                {
                    IntPtr ptr = Marshal.AllocHGlobal(size);
                    Marshal.StructureToPtr(obj, ptr, false);
                    Marshal.Copy(ptr, bytes, 0, size);
                    Marshal.FreeHGlobal(ptr);
                    return bytes;
                }
                catch (Exception ee)
                {
                    MessageBox.Show(ee.Message);
                    return bytes;
                }
    }//使用这个方法将byte数组转化为结构体
    public static object BytesToStuct2(byte[] bytes, ImageDataMsg  type)
            {
                //得到结构体的大小
                int size = Marshal.SizeOf(type);
                //byte数组长度小于结构体的大小
                if (size > bytes.Length)
                {
                    //返回空
                    return null;
                }
                //分配结构体大小的内存空间
                IntPtr structPtr = Marshal.AllocHGlobal(size);
                //将byte数组拷到分配好的内存空间
                Marshal.Copy(bytes, 0, structPtr, size);
                //将内存空间转换为目标结构体
                object obj = Marshal.PtrToStructure(structPtr, typeof(ImageDataMsg));
                //释放内存空间
                Marshal.FreeHGlobal(structPtr);
                //返回结构体
                return obj;
            }
    不知道这样是不是可以解决你的问题?
      

  10.   

    c++代码:
    C++里: 
    //定义CAN信息帧的数据类型。 
    typedef  struct  _VCI_CAN_OBJ{ 
    UINT ID; 
    UINT TimeStamp; 
    BYTE TimeFlag; 
    BYTE SendType; 
    BYTE RemoteFlag;//是否是远程帧 
    BYTE ExternFlag;//是否是扩展帧 
    BYTE DataLen; 
    BYTE Data[8]; 
    BYTE Reserved[3]; 
    }VCI_CAN_OBJ,*PVCI_CAN_OBJ; //数据发送 
    ULONG SenddataCan(PVCI_CAN_OBJ pSend,ULONG Len)//SendData 请问如何能将其传入函数ULONG SenddataCan(PVCI_CAN_OBJ pSend,ULONG Len)//SendData
    (即结构体作参数传递进函数,pSend是一个结构体指针) 首先加载DLL:
     [DllImport("CANLINK.dll",
       EntryPoint = "SenddataCan",
              CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
            unsafe public static extern ulong SenddataCan([MarshalAs(UnmanagedType.LPStruct)]CAN_OBJ MySendOBJ, ulong Len);
    这里是否该这样写([MarshalAs(UnmanagedType.LPStruct)]CAN_OBJ MySendOBJ
    再传递参数
           CAN_OBJ send;//定义结构体   
                send.ID = 0x00000100;
                byte[] mydata =new byte[8];
                mydata[0] =1;
                mydata[1]=1;
                mydata[2] = 1;
                mydata[3] = 1;
                mydata[4] = 1;
                mydata[5] = 1;
                mydata[6] = 1;
                mydata[7] = 1;
                send.Data = mydata;
                SenddataCan(send, 1);//?这里结构体send该如何正确传入???以上代码编译无错,运行时候提示:
    未处理的“System.Runtime.InteropServices.MarshalDirectiveException”类型的异常出现在 CANtest.exe 中。其他信息: 无法封送处理“parameter #1”: 无效的托管/非托管类型组合(该值类型必须与 Struct 成对出现)。
      

  11.   

    后将起改为ref 
    EntryPoint = "SenddataCan", 
              CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
            unsafe public static extern ulong SenddataCan(ref CAN_OBJ MySendOBJ, ulong Len); 调用
    SenddataCan(ref send, 1);可以执行,但是结果却是不对的,网上也有类似问题,请高人指点一下这是为何,如何才能正确搞定!
      

  12.   

    我说过你需要将结构体转化为一个byte[] 型的数组,也给了你方法:
    public static byte[] Struct2Bytes(ImageDataMsg  obj) 

          int size = Marshal.SizeOf(obj); 
          byte[] bytes = new byte[size]; 
          try 
                { 
                    IntPtr ptr = Marshal.AllocHGlobal(size); 
                    Marshal.StructureToPtr(obj, ptr, false); 
                    Marshal.Copy(ptr, bytes, 0, size); 
                    Marshal.FreeHGlobal(ptr); 
                    return bytes; 
                } 
                catch (Exception ee) 
                { 
                    MessageBox.Show(ee.Message); 
                    return bytes; 
                } 
    } 可是在定义结构体的时候需要在数组的前面加上
    public struct ImageDataMsg 

            public char DataType; 
            public int Srv_index; 
            public char ConvertType; 
            //这个个地方要指定长度,这样就可以的德奥结构体的正确长度了 
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] 
           public int[] VecLayer;//需要那几个图层。 
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] 
            public int[] GridLayer;//需要那几个栅格图层 
            public int Scale_index;//需要的是那个比例尺的图像 
           public int x_pos; 
            public int y_pos; 
            public int ClientArea_x; 
            public int ClientArea_y; 
      

  13.   

    public struct _VCI_CAN_OBJ
    {
    public uint ID;
    public uint TimeStamp;
    public byte TimeFlag;
    public byte RemoteFlag;//是否是远程帧 
    public byte ExternFlag;//是否是扩展帧 
    public byte DataLen;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
    public byte[] Data;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public byte[] Reserverd;
    }//数据发送
    ULONG SenddataCan(ref _VCI_CAN_OBJ pSend,ULONG Len)//SendData 
      

  14.   

    public struct _VCI_CAN_OBJ
    {
    public uint ID;
    public uint TimeStamp;
    public byte TimeFlag;
    public byte RemoteFlag;//是否是远程帧 
    public byte ExternFlag;//是否是扩展帧 
    public byte DataLen;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
    public byte[] Data;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public byte[] Reserverd;
    }//数据发送,这里也改正过来
    uint SenddataCan(ref _VCI_CAN_OBJ pSend,uint Len)//SendData