我将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;
}
答案 0 :(得分:1)
不要这样做,std::string
不是POD。
即使使用不同的编译器/链接器版本std::string
也不是二进制兼容*,您也不能指望它在托管和非托管世界之间兼容。
*我的意思是,如果您使用XX编译器版本(即使是相同的供应商)进行DLL构建,并从客户端(EXE)传递std::string
,该客户端使用较旧/较新的编译器/标头构建版本 - string
对象可能不相同。
答案 1 :(得分:-1)