C# 如何复制字符串设置为ByValTStr的结构
我有一个如下所示的结构:C# 如何复制字符串设置为ByValTStr的结构,c#,struct,marshalling,unmarshalling,C#,Struct,Marshalling,Unmarshalling,我有一个如下所示的结构: [StructLayout(LayoutKind.Explicit, Size = 17, CharSet = CharSet.Ansi)] public struct MyStruct { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 17)] [FieldOffset(0)] public string myString; } 但是,当我使用Marshal.copy(…)复制结构以测试它时,字符串打
[StructLayout(LayoutKind.Explicit, Size = 17, CharSet = CharSet.Ansi)]
public struct MyStruct
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 17)]
[FieldOffset(0)] public string myString;
}
但是,当我使用Marshal.copy(…)
复制结构以测试它时,字符串打印出来时,就好像null或空一样
MyStruct myStruct = new MyStruct { myString = "Hello, World!" };
byte[] bytes = new byte[Marshal.SizeOf(typeof(MyStruct))];
GCHandle handle = GCHandle.Alloc(myStruct, GCHandleType.Pinned);
Marshal.Copy(handle.AddrOfPinnedObject(), bytes, 0, Marshal.SizeOf(typeof(MyStruct)));
handle.Free();
handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
myStruct = Marshal.PtrToStructure<MyStruct>(handle.AddrOfPinnedObject());
handle.Free();
MyStruct MyStruct=newmystruct{myString=“你好,世界!”;
byte[]bytes=新字节[Marshal.SizeOf(typeof(MyStruct))];
GCHandle=GCHandle.Alloc(myStruct,GCHandleType.pinted);
Copy(handle.AddrOfPinnedObject(),字节,0,Marshal.SizeOf(typeof(MyStruct));
handle.Free();
handle=GCHandle.Alloc(字节,GCHandleType.pinted);
myStruct=Marshal.PtrToStructure(handle.AddrOfPinnedObject());
handle.Free();
myStruct.myString
读取为空。
我是否遗漏了什么(可能很明显)
谢谢,它应该以什么形式打印?ByVatTStr适用于结构的非托管表示。托管的
myString
为空。您不会显示如何使用Marshal.Copy
,但它的重载都不会对复杂类型执行任何操作,因此它不能对封送属性执行任何操作—它只是一个平面副本<代码>封送。StructureToPtr执行封送。请注意,如果您只想复制一个17字节的字符数组,而不想复制其他内容,那么用struct包装它并不是最简单的方法。我试图做的是在一个结构中有一个字符串,并将该结构复制到字节,然后移动它(可能通过网络),然后在以后将这些字节转换回结构。我会更新问题的。是的,不要。封送拆收器用于与非托管代码接口。它不是一个通用的二进制序列化程序;内置的远程处理功能(尽管现在已被弃用)、gRPC和Protobuf,以及简单的序列化机制(如JSON)和其他现代方法(如System.IO.Pipelines
)。使用封送拆收器既不简单也不快速,无论您是定义自己的协议还是尝试遵守现有协议。即使是使用BinaryReader
/BinaryWriter
的手动滚动代码也更健壮,而且速度可能不会慢很多。嗯,我不确定是否有合适的.net版本。