gpt4 book ai didi

c# - Marshal.StructureToPtr 因 bool 和固定大小数组而失败?

转载 作者:太空狗 更新时间:2023-10-29 18:29:49 25 4
gpt4 key购买 nike

如果我用 StructureToPtr 编码这个结构,然后用 PtrToStructure 再次解码它,我的第一个节点有 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但实际上并不是问题的根源。无论数组长度如何,只复制数组的第一个元素。不确定是什么导致了这个问题,我从不在 pinvoke 中使用 fixed。我只能推荐传统的 pinvoke 方式,效果很好:

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/

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