在 C# 上用联合声明 C 结构
Declaring C struct with union on C#
我想在我的代码中声明 _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# 结构。然后使用显式布局为联合声明一个类型。
[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;
}
当你像这样叠加对象时,对涉及的类型有额外的要求。例如,您不能覆盖包含字符串或数组的类型。因此,字符数组必须作为值类型来实现,例如 fixed array。这操作起来很不方便,但是 MS 并没有考虑到 C# 来定义类型。
我想在我的代码中声明 _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# 结构。然后使用显式布局为联合声明一个类型。
[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;
}
当你像这样叠加对象时,对涉及的类型有额外的要求。例如,您不能覆盖包含字符串或数组的类型。因此,字符数组必须作为值类型来实现,例如 fixed array。这操作起来很不方便,但是 MS 并没有考虑到 C# 来定义类型。