将c struct从dll转换为c#

时间:2010-12-28 19:04:57

标签: c# c dll import struct

我使用的是用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#中定义这些结构的正确方法是什么?谢谢

3 个答案:

答案 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