++dll函数代码如下: 结构体原形: 
typedef struct MY_DATA 

  char NexPacLen[5];  int DataSort;
  int CommType; 
  char *DataBuff; 
} MY_DATATYPE; C#结构体如下:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
 public struct MY_DATA
        {
            [MarshalAs(UnmanagedType.ByValTStr,SizeConst = 5)]
            public char[] NexPacLen;
            public int DataSort;
            public int CommType;
            //public IntPtr Databuff;
        };问题出在新增的域,char型数组上;
而对应C#中默认的 char型是UNICODE,1个字符占2个字节,C++里的char型占1个字节的;
要怎么修饰呢?前面的布局修饰加和不加一样的嘛?!彻底崩溃,为啥要搞ansi,unicode2种那么麻烦啊,有没有搞错啊5555555555555555555谁来帮我看看呀
高手快入啊问题补充,我试了string,String,StringBuilder,byte[],没一样OK的。。太烦人了
快被类型转换搞死了。。

解决方案 »

  1.   

    [StructLayout(LayoutKind.Sequential,Packet=1, CharSet = CharSet.Ansi)]
    public struct MY_DATA
    {
    [MarshalAs(UnmanagedType.ByValTStr,SizeConst = 5)]
    public byte[] NexPacLen;
    public int DataSort;
    public int CommType;
    public IntPtr Databuff;
    };如果在C++中MY_DATA的长度是20,那你就将Packet=1改为4。
      

  2.   


    [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet=System.Runtime.InteropServices.CharSet.Ansi)]
    public struct MY_DATA {
        
        /// char[5]
        [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=5)]
        public string NexPacLen;
        
        /// int
        public int DataSort;
        
        /// int
        public int CommType;
        
        /// char*
        public System.IntPtr DataBuff;
    }这个不知道成不
      

  3.   

    不行啊不行啊谁会啊?C++结构体里有char[]数组,C#里该怎么对应上啊
    555
      

  4.   


    [StructLayout(LayoutKind.Sequential,Packet=4, CharSet = CharSet.Ansi)]
    public struct MY_DATA
    {
    [MarshalAs(UnmanagedType.ByValTStr,SizeConst = 5)]
    public byte[] NexPacLen;
    public int DataSort;
    public int CommType;
    public IntPtr Databuff;
    };在C++中MY_DATA的长度是20,改为Packet=4。
    另外把你调用的这个DLL函数的接口也贴出来看看.
      

  5.   

    接口函数:MY_DATATYPE SendBufTo()
    {
       return msd;//MY_DATATYPE类型数据
    }
    typedef struct MY_DATA 

    char NexPacLen[5];int DataSort;
    int CommType; 
    char *DataBuff; 
    } MY_DATATYPE; *******************************************************************
    public byte[] NexPacLen;//这个我也试了,不行,我查了,对应C++类型好像是BYTE,不是char;
    ***********************************************************************
    我现在的问题是,不知道怎么修饰c#结构体里char类型,修饰它为ansi类型,我想应该会成功的;
    我觉得问题出在unicode与ansi之间你们说呢??
      

  6.   

    http://topic.csdn.net/u/20100308/22/bbffd07e-fdc9-469d-bbf8-af3c49617c9e.htmlC#中byte是8位的有符号数据,C++中char是8位的有符号数据,两者是一致的。DLL中最好不要返回结构体数据,建议结构体数据通过ref的方式进行参数传递,获取返回值
      

  7.   

    在C++中MY_DATA的长度是20,改为Packet=4。
    另外把你调用的这个DLL函数的接口也贴出来看看.
      

  8.   

    接口函数:MY_DATATYPE SendBufTo()
    {
    return msd;//MY_DATATYPE类型数据
    }
    typedef struct MY_DATA 

    char NexPacLen[5];int DataSort;
    int CommType; 
    char *DataBuff; 
    } MY_DATATYPE; C#代码
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi,Pack = 4)]
            public struct MY_DATA
            {
                //[MarshalAs(UnmanagedType.AnsiBStr,SizeConst=5)]
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=5)]
                public byte[] NexPacLen;
                public int DataSort;
                public int CommType;
                public IntPtr Databuff;
             }
    这样写吗?
    还是不行哦~~继续请教高手~~~
      

  9.   

    好吧。。我妥协了,如果引用该怎么写啊接口函数是不是这样写:
    void SendBufTo(&MY_DATATYPE msd)
    {}C#委任是不是这样声明:
    public delegate void SendBuffTo(ref MY_DATATYPE mssd);- . - ~~~~ 
    可以这样写吗?要不哪位高手给个例子我看看哈。。
      

  10.   

    你先用C++调用这个函数试试,看能不能成功?
    如果可以,你把DLL的源码发出来看看?
      

  11.   


    这样就可以了
    http://topic.csdn.net/u/20100308/16/ef639120-ae8c-41f5-9d5d-e9b57e17a302.html一般系统的API对结构体也是以ref的方式来进行传递的。
      

  12.   

    xingyuebuyu,谢谢你我总算搞定了:把代码贴出来:C#结构体声明:
      [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
            public struct MY_DATA
            {            /// char[5]
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
                public string NexPacLen;            /// int
                public int DataSort;            /// int
                public int CommType;            /// char*
                public IntPtr DataBuff;
            }委任声明:
    public delegate void SendBuffTo(ref MY_DATA mssd);结构体变量初始化:
     MY_DATA mssd;
                mssd.DataSort = 0;
                mssd.CommType = 0;
                mssd.NexPacLen = "9999";
                mssd.DataBuff = new IntPtr();调用:
    SendBuffTo sbt = (SendBuffTo)DllWrap.GetDelegateFromInt(FunSenBuf, typeof(SendBuffTo));
    sbt(ref mssd);C++代码: void SendBuffTo(MY_DATATYPE &mssd)
      {
      if(MY_EMPTY!=msd.DataSort&&0!=msd.DataSort)
      {
      mssd.DataSort = msd.DataSort;
      mssd.CommType = msd.CommType;
      strcpy_s(&mssd.NexPacLen[0],5,&msd.NexPacLen[0]);
      mssd.DataBuff = msd.DataBuff;
      //strcpy_s(mssd.DataBuff,MYBUFFSIZE*sizeof(char),msd.DataBuff);
                      //同志们注意,这里因为C#里是没有这样给指针建立堆栈空间方法的,这样赋值用其他代码调会出debug assertion failed,所以直接将指针地址传出去就OK了;   }
          
      }经过测试,能C#中已能正确解析C++中的结构体了,哈哈
    不过还有点担心,毕竟C++中BUFF是直接给的地址,不清楚C#new intptr对象的时候具体干了什么,有无更安全的C#初始化方法,我这样的代码会出问题吗?(现在暂时没问题)给分结贴咯~~~