在C#上声明具有并集的C结构

本文关键字:结构 声明 | 更新日期: 2023-09-27 18:26:38

我想在代码中声明_WAITCHAIN_NODE_INFO结构声明,以供WCT使用。我试着遵循以下教程:

https://msdn.microsoft.com/en-us/library/eshywdt7(v=vs.110).aspx

但每次在托管结构声明中使用WCT调用时,都会出现堆损坏。

typedef struct _WAITCHAIN_NODE_INFO {
  WCT_OBJECT_TYPE   ObjectType;
  WCT_OBJECT_STATUS ObjectStatus;
  union {
    struct {
      WCHAR         ObjectName[WCT_OBJNAME_LENGTH];
      LARGE_INTEGER Timeout;
      BOOL          Alertable;
    } LockObject;
    struct {
      DWORD ProcessId;
      DWORD ThreadId;
      DWORD WaitTime;
      DWORD ContextSwitches;
    } ThreadObject;
  };
} WAITCHAIN_NODE_INFO, *PWAITCHAIN_NODE_INFO;

MSDN:https://msdn.microsoft.com/en-us/library/windows/desktop/ms681422(v=vs.85).aspx

唯一没有让我崩溃的声明是:

public struct WAITCHAIN_NODE_INFO
{
    public WCT_OBJECT_TYPE ObjectType;
    public WCT_OBJECT_STATUS ObjectStatus;
}

显然,我这里缺少LockObject和ThreadObject结构的并集。

如何将此C结构转换为C#托管声明?

任何帮助都将不胜感激。

在C#上声明具有并集的C结构

以通常的方式将并集中的两个结构声明为C#结构。然后使用显式布局为并集声明一个类型。

[StructLayout(LayoutKind.Explicit)] 
public struct _WAITCHAIN_NODE_INFO_UNION
{
    [FieldOffset(0)]
    _WAITCHAIN_NODE_INFO_LOCK_OBJECT LockObject;
    [FieldOffset(0)]
    _WAITCHAIN_NODE_INFO_THREAD_OBJECT ThreadObject;
}

然后将并集添加到结构中:

[StructLayout(LayoutKind.Sequential)]
public struct WAITCHAIN_NODE_INFO
{
    public WCT_OBJECT_TYPE ObjectType;
    public WCT_OBJECT_STATUS ObjectStatus;
    public _WAITCHAIN_NODE_INFO_UNION Union;
}

当您像这样覆盖对象时,会对所涉及的类型提出额外的要求。例如,不能覆盖包含字符串或数组的类型。因此,字符数组必须实现为值类型,例如固定数组。这很不方便操作,但MS没有考虑到C#来定义类型。