Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何复制字符串设置为ByValTStr的结构_C#_Struct_Marshalling_Unmarshalling - Fatal编程技术网

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版本。