[英]Marshalling Array of Struct from IntPtr - Only First Value Marshals Correctly
我正在从外部程序将地址传递给结构数组到C#DLL中。
我以为我会先尝试通过将指针编组到C#端的结构数组中来进行简单测试,以查看该方法是否可行。
给定以下结构:
[StructLayout(LayoutKind.Sequential)]
struct TestStruct
{
public int id;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string someString;
}
下面的代码尝试读取struct数组(直到for循环的那一部分只是为了模拟从其他程序传递来的指针):
TestStruct[] testStructs = new TestStruct[3];
testStructs[0].id = 1;
testStructs[0].someString = "Value 1";
testStructs[1].id = 2;
testStructs[1].someString = "Value 2";
testStructs[2].id = 3;
testStructs[2].someString = "Value 3";
int size = Marshal.SizeOf(testStructs[0]);
IntPtr ptrFirst = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(testStructs[0], ptrFirst, true);
long ptrAddrLong = ptrFirst.ToInt64();
for (int i = 0; i < testStructs.Length; i++) {
IntPtr thisPtr = new IntPtr(ptrAddrLong);
TestStruct testStruct = Marshal.PtrToStructure<TestStruct>(thisPtr);
ptrAddrLong += size;
}
谁能阐明为什么,当我通过for循环调试时,只有第一个testStruct项从指针正确编组了? 所有后续项在字段中都包含垃圾,因为在第一次迭代后,指针地址似乎不正确。
大小报告为36,这似乎是正确的。
我尝试使用显式布局,但这没有任何区别。
谢谢
为什么您认为Marshal.StructureToPtr会比您已告知的任何其他方式进行封送?
Marshal.StructureToPtr(testStructs[0], ptrFirst, true);
编组的单个 TestStruct于在存储器ptrFirst
。
基本上,它只是考虑所有这些封送处理属性的智能内存副本。
PS:考虑到ptrFirst
内存ptrFirst
可以容纳Marshal.SizeOf(testStructs[0])
。 因此,您(至少不会冒一些讨厌的内存访问问题的风险) 无法读取ptrFirst + size
之后的内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.