преобразование структуры c в c # из dll - PullRequest
3 голосов
/ 28 декабря 2010

Я использую DLL, которая была написана в c. Я импортировал все нужные мне функции в мою программу на c #. Большинство функций, которые я могу заставить работать правильно, но у меня проблемы с некоторыми. Функции, с которыми у меня возникают проблемы, требуют ввода структуры. Я предполагаю, что мне нужно определить эту структуру в 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 ]

1 голос
/ 28 декабря 2010

Объявление C недопустимо, затрудняет дать хороший ответ. Обычно вы не можете работать с битовыми полями, но в этом особом случае это работает, поскольку все они кратны 8 битам. Вам нужно [StructLayout (LayoutKind.Explicit)] и использовать [FieldOffset (x)] для каждого поля. Длинные с плохим именем unsigned long, std_flags и a имеют смещение 0. b в 1. high и high_word в 2.

1 голос
/ 28 декабря 2010

Создайте структуру C #, примените к ней [StructLayout] и перечислите поля в том же порядке, что и в C. Для структуры FLAGS_TYPE вы должны использовать атрибут [FieldOffset] в полях.Все члены объединения начинаются с одного и того же адреса памяти, поэтому примените к ним один и тот же [FieldOffset (0)].

ОБНОВЛЕНИЕ: теперь, когда оно отформатировано, я думаю, вам вообще не нужно использовать объединения,Используйте одно 32-битное целое число и получайте различные поля с помощью побитовых операций, так безопаснее.

0 голосов
/ 10 сентября 2012

FieldOffset - это единица байта. Таким образом, Вы можете выразить до байта только через FieldOffset. Вы можете создать свой собственный FieldOffset.

...