C定义结构如下:
#pragma pack(push,_CTRL_BLOCK)
#pragma pack(1)
struct DeliverResp
{
char SMsgID[21];
int NMsgFormat;
char SSrcTermID[22];
int NIsReport;
int NMsgLen;
char sMsgContent[253];
char sDestTermID[22];
char sRecvTime[15];
char sReserved[9];
int  nTP_pid; 
int  nTP_udhi;
char  sLinkID[21];
int  nSrcTermType;
char  sSrcTermPseudo[22];
int  nSubmitMsgType; 
int  nSPDealResult;
};
#pragma pack(pop,_CTRL_BLOCK)C 函数调用
int WINAPI SMGPDeliver( int nTimeOut, DeliverResp* pDeliverResp );现在C#中调用这个函数,dll中包含的其他函数调用没问题,就是这个接收信息的出错,估计是结构定义有问题,无法对齐dll返回的数据,C#代码如下:
函数调用:
[DllImport("****.dll")]
        public static extern int SMGPDeliver(int nTimeOut, out DeliverResp pDeliverResp);结构定义,我目前用了两种:
    [StructLayout(LayoutKind.Sequential, Size = 417)]
    public struct DeliverResp
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 21)]
        public byte[] SMsgID;
        public int NMsgFormat;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)]
        public byte[] SSrcTermID;
        public int NIsReport;
        public int NMsgLen;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 253)]
        public byte[] sMsgContent;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)]
        public byte[] sDestTermID;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
        public byte[] sRecvTime;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 9)]
        public byte[] sReserved;
        public int nTP_pid;                
        public int nTP_udhi;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 21)]
        public byte[] sLinkID;
        public int nSrcTermType;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)]
        public byte[] sSrcTermPseudo;   
        public int nSubmitMsgType; 
        public int nSPDealResult;
    }
这种可以编译运行,但是返回的结果没有对齐,请帮忙看看到底哪里出了问题。第二种编译出错 “因为它在 23 偏移位置处包含一个对象字段,该字段已由一个非对象字段不正确地对齐或重叠。”,第一次用这种定义方法,参考了msdn中的示例代码,没发现有什么问题,不知道出错的原因,也请高手指点一下,结构定义代码如下,几个byte[]的大小可参考上一个结构定义:
    [StructLayout(LayoutKind.Explicit)]
    public struct DeliverResp
    {
        [FieldOffset(0)]public byte[] SMsgID;
        [FieldOffset(21)]public int NMsgFormat; 
        [FieldOffset(25)]public byte[] SSrcTermID; 
        [FieldOffset(47)]public int NIsReport;
        [FieldOffset(51)]public int NMsgLen;
        [FieldOffset(55)]public byte[] sMsgContent;
        [FieldOffset(308)]public byte[] sDestTermID;
        [FieldOffset(330)]public byte[] sRecvTime; 
        [FieldOffset(345)]public byte[] sReserved;
        [FieldOffset(354)]public int nTP_pid; 
        [FieldOffset(358)]public int nTP_udhi;
        [FieldOffset(362)]public byte[] sLinkID;
        [FieldOffset(383)]public int nSrcTermType;
        [FieldOffset(387)]public byte[] sSrcTermPseudo;
        [FieldOffset(409)]public int nSubmitMsgType;
        [FieldOffset(413)]public int nSPDealResult;
    }

解决方案 »

  1.   

    你首先得有DeliverResp的C结构吧,要不自己怎么能猜对呢?
      

  2.   

    C定义结构如下:
    #pragma pack(push,_CTRL_BLOCK)
    #pragma pack(1)
    struct DeliverResp
    {
    char SMsgID[21];
    int NMsgFormat;
    char SSrcTermID[22];
    int NIsReport;
    int NMsgLen;
    char sMsgContent[253];
    char sDestTermID[22];
    char sRecvTime[15];
    char sReserved[9];
    int  nTP_pid; 
    int  nTP_udhi;
    char  sLinkID[21];
    int  nSrcTermType;
    char  sSrcTermPseudo[22];
    int  nSubmitMsgType; 
    int  nSPDealResult;
    };
    #pragma pack(pop,_CTRL_BLOCK)我写到上面的,呵呵
      

  3.   

    加上pack试试呢 [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct DeliverResp
    ....
      

  4.   

    tiaoci(我挑刺,我快乐) ,按照你的方法,ok了
    但是我的第二种结构定义方式怎么会出错呢,能帮我找找原因吗?第二种编译出错 “因为它在 25 偏移位置处包含一个对象字段,该字段已由一个非对象字段不正确地对齐或重叠。”,第一次用这种定义方法,参考了msdn中的示例代码,没发现有什么问题,不知道出错的原因,也请高手指点一下,结构定义代码如下,几个byte[]的大小可参考上一个结构定义:
        [StructLayout(LayoutKind.Explicit)]
        public struct DeliverResp
        {
            [FieldOffset(0)]public byte[] SMsgID;
            [FieldOffset(21)]public int NMsgFormat; 
            [FieldOffset(25)]public byte[] SSrcTermID; 
            [FieldOffset(47)]public int NIsReport;
            [FieldOffset(51)]public int NMsgLen;
            [FieldOffset(55)]public byte[] sMsgContent;
            [FieldOffset(308)]public byte[] sDestTermID;
            [FieldOffset(330)]public byte[] sRecvTime; 
            [FieldOffset(345)]public byte[] sReserved;
            [FieldOffset(354)]public int nTP_pid; 
            [FieldOffset(358)]public int nTP_udhi;
            [FieldOffset(362)]public byte[] sLinkID;
            [FieldOffset(383)]public int nSrcTermType;
            [FieldOffset(387)]public byte[] sSrcTermPseudo;
            [FieldOffset(409)]public int nSubmitMsgType;
            [FieldOffset(413)]public int nSPDealResult;
        }