C#变量字符串大小的Interop c ++结构

时间:2011-07-23 00:59:53

标签: c# c++

我将ipc从非托管转移到托管代码。 是否可以在不设置常量的情况下传输字符串 或者将其余的字节填入结构的最后一个成员?

c ++ struct

typedef union
{
    struct
    { 
         int id;
         string Data;
    };
    char bytes[];
} SocketData;

c#struct

   [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct SocketData
    {
        public int id;
        public string Data;
    }

将字节转换为struct

public static object RawDeserialize(byte[] rawData, int position, Type anyType)
{
    var rawsize = rawData.Length;
    //if (rawsize > rawData.Length)
    //    return null;
    var buffer = Marshal.AllocHGlobal(rawsize);
    Marshal.Copy(rawData, position, buffer, rawsize);
    var retobj = Marshal.PtrToStructure(buffer, anyType);
    Marshal.FreeHGlobal(buffer);
    return retobj;
}

2 个答案:

答案 0 :(得分:1)

不要这样做,std::string不是POD。 即使使用不同的编译器/链接器版本std::string也不是二进制兼容*,您也不能指望它在托管和非托管世界之间兼容。

*我的意思是,如果您使用XX编译器版本(即使是相同的供应商)进行DLL构建,并从客户端(EXE)传递std::string,该客户端使用较旧/较新的编译器/标头构建版本 - string对象可能不相同。

答案 1 :(得分:-1)

这篇文章可能对您有帮助。

涉及using StringBuilder instead

我想知道为什么你需要可变缓冲区长度,因为套接字通常使用固定长度的缓冲区