我使用的是用c编写的dll。我已将我需要的所有功能导入到我的c#程序中。我可以正常工作的大多数功能,但我遇到了一些问题。我遇到问题的函数需要一个struct作为输入。我假设我需要在C#中定义这个结构,我已经做了但是我开始迷惑自己,所以我将离开我尝试过的东西。结构很长,所以我只想在c:
中看起来像typedef struct chain_link_info
{
unsigned short command;
unsigned long* buff_id;
FLAGS_TYPES flags; // this is a union that i will list below
} CHAIN_LINK_INFO;
typedef union flags_type
{
unsigned long ulong;
struct
{
unsigned short std_flags;
unsigned short high
} ushort;
struct
{
unsigned int a : 1;
unsinged int b : 1;
unsinged int c : 1;
unsinged int d : 1;
unsinged int e : 2;
unsinged int f : 1;
unsinged int g : 1;
unsinged int h : 1;
unsinged int i : 1;
unsinged int j : 1;
unsinged int k : 1;
unsinged int l : 1;
unsinged int m : 1;
unsinged int n : 1;
unsinged int o : 1;
unsigned int high_word :16
} std_bits;
} FLAGS_TYPE;
在C#中定义这些结构的正确方法是什么?谢谢
答案 0 :(得分:1)
创建一个C#结构,对其应用[StructLayout],并按照与C中相同的顺序列出字段。对于FLAGS_TYPE结构,您必须在字段上使用[FieldOffset]属性。联合的所有成员都从相同的内存地址开始,因此对它们应用相同的[FieldOffset(0)]。
更新:现在已经格式化了,我认为你根本不需要使用工会。使用单个32位整数,并通过按位运算获得不同的字段,这样更安全。
答案 1 :(得分:1)
C声明无效,很难给出一个好的答案。你通常不能处理位字段,但在这种特殊情况下它可以工作,因为它们都是8位的倍数。您需要[StructLayout(LayoutKind.Explicit)]并对每个字段使用[FieldOffset(x)]。名称无名的long,std_flags和a的偏移量为0. b为1,high_word为2。
答案 2 :(得分:0)
FieldOffset
是字节单位。
因此,您只能通过FieldOffset
表达最多字节。
您可以创建自己的FieldOffset
。