是否有可能将UInt16制作成枚举?

时间:2012-07-06 10:00:21

标签: c# pinvoke

我有一个字节数组需要编组到以下结构中:

[StructLayout(LayoutKind.Sequential, Pack = 4)]
internal struct ACSEventHeader_t
{
    public UInt32 acsHandle;
    public EventClasses eventClass;
    public UInt16 eventType;
};

EventClasses枚举定义为:

internal enum EventClasses
{
    Request = 0,
    Unsolicited = 1,
    ConnectionConfirmation = 2,
    CommandConfirmation = 5
}

我用来做的代码看起来像这样(eventBuf.Data的类型为byte []):

ACSEventHeader_t h = new ACSEventHeader_t();
IntPtr pt1 = Marshal.AllocHGlobal(eventBuf.Data.Length);
Marshal.Copy(eventBuf.Data, 0, pt1, eventBuf.Data.Length);
h = (ACSEventHeader_t)Marshal.PtrToStructure(pt1, typeof(ACSEventHeader_t));
Marshal.FreeHGlobal(pt1);

执行此代码代码将无异常地工作,但ACSEventHeader_t结构的eventClass属性具有错误的值。 将类型更改为UInt16会获得正确的值,但之后我没有枚举。

我曾尝试将[MarshalAs(UnmanagedType.U2)]添加到eventClass属性中,但这会产生此异常:

Cannot marshal field 'eventClass' of type 'ACSEventHeader_t': 
enter code here`Invalid managed/unmanaged type combination (Int32/UInt32 must be
paired with I4, U4, or Error).

非常感谢任何帮助......

1 个答案:

答案 0 :(得分:6)

只需更改声明enum

的方式即可
internal enum EventClasses : short
{
    Request = 0,
    Unsolicited = 1,
    ConnectionConfirmation = 2,
    CommandConfirmation = 5
}

默认enum的类型为Int32,但您可以明确将其类型设置为您需要的类型。