Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将十六进制枚举参数从C#传递到C_C#_C_Enums_Interop - Fatal编程技术网

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

将十六进制枚举参数从C#传递到C,c#,c,enums,interop,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#代码: 我在Mac上,我使用Mono和Xcode来完成所有这些工作。可以假定C函数是正确的,因为它是我下载的开源库。我认为十六

我在C中有一个接受十六进制参数的函数。我需要从C#调用此函数。我目前的方法似乎不正确,因为我的C函数返回了错误的数字

下面是我的C函数的声明:

enum tags {
    TAG_A = -1,
    TAG_B  = 0x00, 
    TAG_C = 0xC1,  
    ...
};
int myfunction(enum tags t);
这是我的C#代码:

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

解决方案: 我勾选了一个答案,但实际上将C#enum设置为long解决了我的问题。因此,在C#中,我有:

枚举标记:长{ 标签A=-1, 标签B=0x00, 标签C=0xC1, ... }


十六进制只是表示文字整数值的另一种方式。这与你的问题无关。例如
TAG_B=0x00
TAG_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,
    // ...
}
在我的架构sizeof(enum_t)中,其中enum_t是enum的typedef,返回4个字节,因此如果C#enum也是4个字节,我看不出问题所在


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

对常量使用十六进制表示是不相关的。您可能使用了错误的调用约定,或者使用了不同大小的枚举。C#enum需要4个字节,对C enum一无所知。为什么不传递一个整数呢?一天结束时,所有的
标记
都是。c#枚举的大小不必是4个字节(
枚举标记:short{TAG_A=-1}
)@L.B太棒了!谢谢这就是为什么我如此喜欢堆栈溢出。我每天都在学习新的东西。很好的答案!但我观察到一些奇怪的现象:事实上(enum标记:long{TAG_A=-1})对我有效。我检查了我的C枚举是4字节。我的默认C#enum也是4字节。当我用“long”(8字节)修饰我的C#enum时,我的C函数的返回值是正确的。否则它总是错的。我发现很难解释这种现象@LB@CherryQu也许它在C中没有签名?嗯。。。我发现网页上说C和C#enum的默认类型都是int。请参阅,我检查了,我的C和C#enum都是4字节,但将我的C#enum更改为8字节确实解决了问题。
enum tags:short 
{
    TAG_A = -1,
    TAG_B  = 0x00, 
    TAG_C = 0xC1,
    // ...
}