C# 需要帮助将c中的并集转换为c吗#

C# 需要帮助将c中的并集转换为c吗#,c#,c,struct,marshalling,unions,C#,C,Struct,Marshalling,Unions,可能重复: C代码: typedef struct _EVENT_HEADER { USHORT Size; // Event Size USHORT HeaderType; // Header Type USHORT Flags; // Flags USHORT EventProperty;

可能重复:

C代码:

typedef struct _EVENT_HEADER {
USHORT              Size;                   // Event Size
USHORT              HeaderType;             // Header Type
USHORT              Flags;                  // Flags
USHORT              EventProperty;          // User given event property
ULONG               ThreadId;               // Thread Id
ULONG               ProcessId;              // Process Id
LARGE_INTEGER       TimeStamp;              // Event Timestamp
GUID                ProviderId;             // Provider Id
EVENT_DESCRIPTOR    EventDescriptor;        // Event Descriptor
union {
    struct {
        ULONG       KernelTime;             // Kernel Mode CPU ticks
        ULONG       UserTime;               // User mode CPU ticks
    } DUMMYSTRUCTNAME;
    ULONG64         ProcessorTime;          // Processor Clock 
                                            // for private session events
} DUMMYUNIONNAME;
GUID                ActivityId;             // Activity Id

} EVENT_HEADER, *PEVENT_HEADER;
除了工会,我什么都改了。如何将其转换为C#?

您可以使用[StructLayout(LayoutKind.Explicit)]将成员显式放置在正确的偏移位置

下面是我前面提供的示例

[StructLayout(LayoutKind.Explicit)]
public struct CharUnion
{
  [FieldOffset(0)] public char UnicodeChar;
  [FieldOffset(0)] public byte AsciiChar;
}

[StructLayout(LayoutKind.Explicit)]
public struct CharInfo
{
  [FieldOffset(0)] public CharUnion Char;
  [FieldOffset(2)] public short Attributes;
}
C#本身并不支持C/C++的联合概念。但是,您可以使用StructLayout(LayoutKind.Explicit)和FieldOffset属性创建等效功能

关于
union
:在下面的代码中,您可以看到
Kernel
ProcessorTime
具有相同的偏移量。LargeInteger也是C#中联合实现的一个很好的例子

EventHeader

[StructLayout(LayoutKind.Explicit)]
public struct EventHeader
{
    [FieldOffset(0)]
    public ushort Size;

    [FieldOffset(2)]
    public ushort HeaderType;

    [FieldOffset(4)]
    public ushort Flags;

    [FieldOffset(6)]
    public ushort EventProperty;

    [FieldOffset(8)]
    public uint ThreadId;

    [FieldOffset(12)]
    public uint ProcessId;

    [FieldOffset(16)]
    public LargeInteger TimeStamp;

    [FieldOffset(24)]
    public Guid ProviderId;

    [FieldOffset(40)]
    public Guid EventDescriptor;

    [FieldOffset(52)]
    public uint KernelTime;

    [FieldOffset(56)]
    public uint UserTime;

    [FieldOffset(52)]
    public ulong ProcessorTime;

    [FieldOffset(60)]
    public Guid ActivityId;
}
[StructLayout(LayoutKind.Explicit, Size = 8)]
public struct LargeInteger
{
    [FieldOffset(0)]
    public long QuadPart;

    [FieldOffset(0)]
    public uint LowPart;

    [FieldOffset(4)]
    public uint HighPart;
}
[StructLayout(LayoutKind.Sequential)]
public struct EventDescriptor
{
    public ushort Id;

    public byte Level;

    public byte Channel;

    public byte LevelSeverity;

    public byte Opcode;

    public ushort Task;

    public uint Keyword;
}
LargeInteger

[StructLayout(LayoutKind.Explicit)]
public struct EventHeader
{
    [FieldOffset(0)]
    public ushort Size;

    [FieldOffset(2)]
    public ushort HeaderType;

    [FieldOffset(4)]
    public ushort Flags;

    [FieldOffset(6)]
    public ushort EventProperty;

    [FieldOffset(8)]
    public uint ThreadId;

    [FieldOffset(12)]
    public uint ProcessId;

    [FieldOffset(16)]
    public LargeInteger TimeStamp;

    [FieldOffset(24)]
    public Guid ProviderId;

    [FieldOffset(40)]
    public Guid EventDescriptor;

    [FieldOffset(52)]
    public uint KernelTime;

    [FieldOffset(56)]
    public uint UserTime;

    [FieldOffset(52)]
    public ulong ProcessorTime;

    [FieldOffset(60)]
    public Guid ActivityId;
}
[StructLayout(LayoutKind.Explicit, Size = 8)]
public struct LargeInteger
{
    [FieldOffset(0)]
    public long QuadPart;

    [FieldOffset(0)]
    public uint LowPart;

    [FieldOffset(4)]
    public uint HighPart;
}
[StructLayout(LayoutKind.Sequential)]
public struct EventDescriptor
{
    public ushort Id;

    public byte Level;

    public byte Channel;

    public byte LevelSeverity;

    public byte Opcode;

    public ushort Task;

    public uint Keyword;
}
EventDescriptor

[StructLayout(LayoutKind.Explicit)]
public struct EventHeader
{
    [FieldOffset(0)]
    public ushort Size;

    [FieldOffset(2)]
    public ushort HeaderType;

    [FieldOffset(4)]
    public ushort Flags;

    [FieldOffset(6)]
    public ushort EventProperty;

    [FieldOffset(8)]
    public uint ThreadId;

    [FieldOffset(12)]
    public uint ProcessId;

    [FieldOffset(16)]
    public LargeInteger TimeStamp;

    [FieldOffset(24)]
    public Guid ProviderId;

    [FieldOffset(40)]
    public Guid EventDescriptor;

    [FieldOffset(52)]
    public uint KernelTime;

    [FieldOffset(56)]
    public uint UserTime;

    [FieldOffset(52)]
    public ulong ProcessorTime;

    [FieldOffset(60)]
    public Guid ActivityId;
}
[StructLayout(LayoutKind.Explicit, Size = 8)]
public struct LargeInteger
{
    [FieldOffset(0)]
    public long QuadPart;

    [FieldOffset(0)]
    public uint LowPart;

    [FieldOffset(4)]
    public uint HighPart;
}
[StructLayout(LayoutKind.Sequential)]
public struct EventDescriptor
{
    public ushort Id;

    public byte Level;

    public byte Channel;

    public byte LevelSeverity;

    public byte Opcode;

    public ushort Task;

    public uint Keyword;
}

免责声明:我刚刚编写了此代码。没有测试它。代码可能有错误。

使用StructLayout和FieldOffset属性。作为旁注,在c#中创建可变严格格式通常是错误的。@Marc,我想在这种情况下,op要求p/Invoke使用该属性,因此选项是有限的。有趣的是,每个结构:
EventHeader
LargeInteger
都类似于位数组(如果是数据类型)…???嗯…新的数据类型…危险!@IAbstract-我不确定我是否理解你的评论。
EventHeader
LargeInteger
是结构,与
BitArray
没有太多共同点。这就是我要问的……但是,唉,我不知道BitArray类。现在我看到了它们的区别。谢谢。。。