将十六进制枚举参数从C#传递给C

时间:2012-11-19 13:01:11

标签: c# c enums interop

我在C中有一个接受十六进制参数的函数。我需要从C#调用这个函数。我目前的做法看起来并不正确,因为我的C函数正在向我返回错误的数字。

这是我的C函数的声明:

enum tags {
    TAG_A = -1,
    TAG_B  = 0x00, 
    TAG_C = 0xC1,  
    ...
};
int myfunction(enum tags t);

这是我的C#代码:

enum tags {
    TAG_A = -1,
    TAG_B  = 0x00, 
    TAG_C = 0xC1, 
    ...
    }

[DllImport ("mylibraryname")]
    public static extern int myfunction(tags t);

myfunction(tags.TAG_B);

我在Mac上,我正在使用Mono和Xcode来完成所有这些工作。可以假定C函数是正确的,因为它是我下载的开源库。我认为十六进制数字有问题,但我不确定。

的解决方案:

我已经勾选了一个答案,但实际上设置C#枚举很长时间才解决了我的问题。所以在C#中,我有:

  

枚举标签:long {       TAG_A = -1,       TAG_B = 0x00,       TAG_C = 0xC1,       ...       }

2 个答案:

答案 0 :(得分:2)

十六进制只是表达文字整数值的另一种方式。这与你的问题无关。例如,TAG_B = 0x00TAG_B = 0两者的意思完全相同。

问题可能是C enum是16位整数,而C#enum是32位。不要在C#中创建枚举,而是尝试将其作为直接Int32值:

static class tags 
{
    public static short TAG_A = -1;
    public static short TAG_B  = 0x00;
    public static short TAG_C = 0xC1;
    // ...
}

[DllImport ("mylibraryname")]
public static extern int myfunction(short t);

myfunction(tags.TAG_B);

或者,正如L.B建议的那样,您只需设置enum成员的类型:

enum tags:short 
{
    TAG_A = -1,
    TAG_B  = 0x00, 
    TAG_C = 0xC1,
    // ...
}

答案 1 :(得分:0)

在我的体系结构sizeof(enum_t)上,其中enum_t是枚举的typedef返回4个字节,所以如果C#enum是4个字节,我也看不到问题。

检查您的体系结构的sizeof的枚举大小,如果它们匹配问题则在其他地方。