gpt4 book ai didi

c# - C# 可变字符串大小中的互操作 C++ 结构

转载 作者:太空宇宙 更新时间:2023-11-04 14:21:59 25 4
gpt4 key购买 nike

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

C++ 结构

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

C# 结构

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

将字节转换为结构

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;
}

最佳答案

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

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

关于c# - C# 可变字符串大小中的互操作 C++ 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6797563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com