2010-12-28 5 views
3

Я использую dll, написанную в c. Я импортировал все функции, которые мне нужны, в мою программу C#. Большинство функций я могу нормально работать, но у меня проблемы с несколькими. Функции, с которыми я сталкиваюсь, требуют ввода структуры. Я предполагаю, что мне нужно определить эту структуру в C#, которую я сделал, но я начинаю путать себя, поэтому я оставлю все, что я пытался. Структура довольно долго, так что я буду просто, как это выглядит в C:Преобразование c struct в C# из dll

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; 

что такое правильный способ определить эту stucts в C#? Спасибо

+1

Я считаю, что это случай, когда [StructLayout] (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute.aspx) входит в игру, но не может быть положительны. –

+0

Извините за нижний уровень, я удалил его. Должен был щелкнуть его случайно. Мне любопытно, как предполагается, что профсоюз будет отображаться. –

ответ

1

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

UPDATE: теперь, когда он отформатирован, я думаю, что вам вообще не нужно использовать союзы. Используйте одно 32-битное целое число и получайте разные поля с побитовыми операциями, это безопаснее.

+0

Да, вопрос должен быть «Каков правильный способ определения структуры в C?» ;-) –

1

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

+0

моё извинения, я исправил вопрос, чтобы быть немного больше похожим на фактические структуры. Оригинальные стойки довольно большие, поэтому я просто пытаюсь их обрезать, надеясь, что простой ответ поможет мне понять, что я делаю неправильно. Спасибо. – poco

+0

Ну, поля бит больше не являются счастливыми кратными 8. Вам нужно будет использовать & и | операторов, если вы хотите получить/установить отдельные биты. –

0

FieldOffset является байтовым модулем. Итак, вы можете выразить upto byte только через FieldOffset. Вы можете создать собственный FieldOffset.

Смежные вопросы