特征就是 winxp下正常
到win7的时候,会报尝试读取或写入受保护的内存。这通常指示其他内存已损坏断点跟踪的时候发现时回调函数结束后报错。    //原型: void (*callbackMessage)(void *data, const MQTTC_Message *msg); 
    [UnmanagedFunctionPointer(CallingConvention.Cdecl,CharSet=CharSet.Ansi)]
    public delegate void callbackMessage(IntPtr data, ref MQTTC_Message msg);//    typedef struct 
//{ 
//    uint16_t mid;                        // 信息ID 
//    int8_t  *topic;                      // 订阅信息的主题 
//    uint8_t *payload;                    // 订阅的信息,即数据 
//    uint32_t payloadlen;                 // 订阅的信息的长度 
//    int32_t  qos;                        // 服务质量级别 
//    int8_t   retain;                     // 保持,扩展功能使用 
//}MQTTC_Message;    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct MQTTC_Message
    {
        public ushort mid;
        public string topic;
        public Byte[] payload;
        public uint payloadlen;
        public int qos;
        public char retain;
    }有人遇到过没

解决方案 »

  1.   

    xp下没有问题说明C#中的声明没有问题。看看能不能让非托管dll的作者在win7进行下调试。
      

  2.   

    结构体对应有问题:// uint8_t *payload; // 订阅的信息,即数据  
    原型应该是:byte *payload; 对吧?你把它对应成:
    public IntPtr payload;
      

  3.   


    贴错了呵呵是 INTPTR PAYLOAD  [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
      public struct MQTTC_Message
      {
      public ushort mid;
      public string topic;
      public IntPtr payload;
      public uint payloadlen;
      public int qos;
      public char retain;
      }
      

  4.   

    问题解决了,
     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
      public struct MQTTC_Message
      {
      public ushort mid;
      public IntPtr topic;
      public IntPtr payload;
      public uint payloadlen;
      public int qos;
      public char retain;
      }
    win7 还是比较严谨的