C# 是否可以将UInt16封送到枚举?

C# 是否可以将UInt16封送到枚举?,c#,pinvoke,C#,Pinvoke,我有一个字节数组,需要封送到以下结构中: [StructLayout(LayoutKind.Sequential, Pack = 4)] internal struct ACSEventHeader_t { public UInt32 acsHandle; public EventClasses eventClass; public UInt16 eventType; }; EventClasses枚举定义为: internal enum EventClasses {

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

[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[]):

按照代码执行此操作将毫无例外地工作,但AcSeventheReader\u t结构的eventClass属性具有错误的值。 将类型更改为UInt16将获得正确的值,但我没有枚举

我已尝试将[Marshallas(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).

任何帮助都将不胜感激……

只需更改您声明
枚举的方式即可:

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

默认情况下,
enum
s的类型为
Int32
,但您可以显式地将其类型设置为您需要的类型。

这确实很有帮助。我一直在寻找类似于[StructLayout]的东西,但这(现在)显然是一条路要走。
internal enum EventClasses : short
{
    Request = 0,
    Unsolicited = 1,
    ConnectionConfirmation = 2,
    CommandConfirmation = 5
}