如果我使用StructureToPtr
编码(marshal)此结构,然后再次使用PtrToStructure
编码(marshal)它,则我的第一个节点的y = {1,2},而我的第二个节点的y = {1,0}。
我不知道为什么,也许我的结构某种程度上是坏的?从结构中删除bool
使其起作用。
using System;
using System.Runtime.InteropServices;
namespace csharp_test
{
unsafe class Program
{
[StructLayout(LayoutKind.Sequential)]
public struct Node
{
public bool boolVar;
public fixed int y[2];
}
unsafe static void Main(string[] args)
{
Node node = new Node();
node.y[0] = 1;
node.y[1] = 2;
node.boolVar = true;
int size = sizeof(Node);
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(node, ptr, false);
Node node2 = (Node)Marshal.PtrToStructure(ptr, typeof(Node));
Marshal.FreeHGlobal(ptr);
}
}
}
最佳答案
这确实是错误的。是StructureToPtr()调用无法复制足够的字节。您可以通过使用Debug + Windows + Memory + Memory1并在地址栏中输入“ptr”来查看此信息。使用sizeof运算符isn't correct,但实际上不是问题的根源。无论数组长度如何,仅复制数组的第一个元素。不知道是什么原因导致了这个问题,我从不使用固定调用。我只能推荐效果很好的传统拼凑方式:
unsafe class Program {
[StructLayout(LayoutKind.Sequential)]
public struct Node {
public bool boolVar;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public int[] y;
}
unsafe static void Main(string[] args) {
Node node = new Node();
node.y = new int[2];
node.y[0] = 1;
node.y[1] = 2;
node.boolVar = true;
int size = Marshal.SizeOf(node);
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(node, ptr, false);
Node node2 = (Node)Marshal.PtrToStructure(ptr, typeof(Node));
Marshal.FreeHGlobal(ptr);
}
如果要引起CLR互操作主机的注意,可以发布connect.microsoft.com。
关于c# - Marshal.StructureToPtr因 bool 和固定大小的数组而失败?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9152119/