我正在使用本机函数,并且在c#中使用编组结构时遇到小问题。我在另一个结构中有指向struct的指针 - 例如C#声明:
[StructLayout(LayoutKind.Sequential, Pack=1, CharSet = CharSet.Auto)]
public struct PARENT
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string Name;
[MarshalAs(UnmanagedType.Struct, SizeConst=8)]
public CHILD pChild;
}
[StructLayout(LayoutKind.Sequential, Pack=1, CharSet = CharSet.Auto)]
public struct CHILD
{
public UInt32 val1;
public UInt32 val2;
}
在PARENT结构中,我应该有一个指向CHILD结构的指针。我需要传递一个'引用指针'(PARENT struct)作为API函数的参数。
单引用没有问题(“ref PARENT”作为导入dll函数的参数)但是如何传递“ref ref”?是否可以不使用不安全的代码(使用C指针)?
问候 亚瑟
答案 0 :(得分:1)
如果您不想使用不安全的代码,那么您需要将Child定义为IntPtr并添加一个属性,然后访问Child IntPtr中的值。
[StructLayout(LayoutKind.Sequential, Pack=1, CharSet = CharSet.Auto)]
public struct PARENT
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string Name;
public IntPtr pChild;
public CHILD Child{
get {
return (CHILD)Marshal.PtrToStructure(pChild, typeof(CHILD));
}
}
}
[StructLayout(LayoutKind.Sequential, Pack=1, CharSet = CharSet.Auto)]
public struct CHILD
{
public UInt32 val1;
public UInt32 val2;
}
我认为使用不安全的代码/指针会更容易,更清晰。
答案 1 :(得分:0)
这是安全和不安全的结合,因为我认为这是合理的。
fixed (void* pt = new byte[Marshal.SizeOf(myStructInstance)])
{
var intPtr = new IntPtr(pt);
Marshal.StructureToPtr(myStructInstance, intPtr, true);
// now "pt" is a pointer to your struct instance
// and "intPtr" is the same, but wrapped with managed code
}