【发布时间】:2011-10-20 15:30:49
【问题描述】:
我有以下代码,我是 .Net 编组的新手,不知道为什么 Marshal.StructureToPtr 仅在我为 Marshal.AllocHGlobal 分配 > 32 个字节时才有效。任何
我需要两个结构中的数组大小都是动态的。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Threading;
namespace LPArrayMarshalTest
{
class Program
{
static void Main(string[] args)
{
try
{
SubInfo sInfo = new SubInfo();
sInfo.SubID = Encoding.ASCII.GetBytes("SUB1");
sInfo.ArrayOfItem = new ushort[1] { 1 };
MainInfo mInfo = new MainInfo();
mInfo.ArrayOfSubItem = new SubInfo[1] { sInfo };
mInfo.MainID = Encoding.ASCII.GetBytes("MAIN");
int mInfoSize = 0;
mInfoSize += mInfo.MainID.Length;
foreach (SubInfo sub in mInfo.ArrayOfSubItem)
{
int sInfoSize = sub.SubID.Length + (sub.ArrayOfItem.Length * Marshal.SizeOf(typeof(ushort)));
mInfoSize += sInfoSize;
}
IntPtr mInfoPtr = Marshal.AllocHGlobal(mInfoSize * 3); //throw error
//IntPtr mInfoPtr = Marshal.AllocHGlobal(mInfoSize * 4); //No Error
Marshal.StructureToPtr(mInfo, mInfoPtr, true);
Marshal.FreeHGlobal(mInfoPtr);
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
Console.ReadLine();
}
}
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct MainInfo
{
[MarshalAs(UnmanagedType.SafeArray)]
public byte[] MainID;
[MarshalAs(UnmanagedType.SafeArray,
SafeArraySubType = VarEnum.VT_RECORD,
SafeArrayUserDefinedSubType = typeof(SubInfo))]
public SubInfo[] ArrayOfSubItem;
}
[ComVisible(true)]
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct SubInfo
{
[MarshalAs(UnmanagedType.SafeArray)]
public byte[] SubID;
[MarshalAs(UnmanagedType.SafeArray)]
public ushort[] ArrayOfItem;
}
}
提前致谢。
【问题讨论】:
-
您没有注意 SAFEARRAY 的大小。很难准确地做到, Marshal.SizeOf() 也没有。 24 字节加上 32 位模式中元素的大小。
标签: marshalling