【发布时间】:2014-06-13 12:27:28
【问题描述】:
我一直试图弄清楚是否可以将结构的一部分编组为字节数组而不会出现任何错误。这样做的原因是因为不会编组的部分有一个可变大小的数组。这是我正在使用的代码。
C#:
public struct Random {
[MarshalAs(UnmanagedType.I4)]
public int a;
[MarshalAs(UnmanagedType.I4)]
public int b;
[MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_RECORD)]
public Random1[] r;
}
public struct Random1 {
[MarshalAs(UnmanagedType.I4)]
public int c;
}
private void Form1_Load(object sender, EventArgs e) {
int size = Marshal.SizeOf(typeof(Random));
int s = 4;
Random r = new Random();
Random r1 = new Random();
r.a = 1;
r.b = 5;
r.r = new Random1[2];
r.r[0].c = 10;
r.r[1].c = 12;
IntPtr p = Marshal.AllocHGlobal(size);
try {
byte[] arr = new byte[size];
Marshal.StructureToPtr(r, p, false);
Marshal.Copy(p, arr, 0, 8);
Marshal.FreeHGlobal(p);
p = Marshal.AllocHGlobal(size);
Marshal.Copy(arr, 0, p, 8);
r1 = (Random) Marshal.PtrToStructure(p, typeof(Random));
Marshal.FreeHGlobal(p);
p = IntPtr.Zero;
Debug.WriteLine(r1.a);
Debug.WriteLine(r1.b);
Debug.WriteLine(r1.r[0].c);
Debug.WriteLine(r1.r[1].c);
} finally {
if (p != IntPtr.Zero) {
Marshal.FreeHGlobal(p);
}
}
}
当我尝试这段代码时,它会在 StructureToPtr 中给我一个 ArgumentException。我做错了什么或者可以这样做吗?如果没有,我已经阅读了有关使用 IntPtr 的内容。谁能告诉我该怎么做?
【问题讨论】:
-
ArgumentException 说明了什么?
-
这是消息参数不正确。 (HRESULT 异常:0x80070057 (E_INVALIDARG))
-
这里的问题是
SafeArray,interop 不太知道如何处理。 -
使用固定大小的数组解决了。
标签: c# arrays struct marshalling