Маршалинг c-структур в c #

У меня есть одна DLL C, которая может принимать структуры в качестве входных данных, мне нужно вызвать эту dll из моей программы на С #

Следующие - это образцы структур, которые у меня есть в c, я должен упорядочить эти структуры в моем коде на С #

я делаю правильно или неправильно?

Фактические структуры C:

typedef struct procedure
{
  char code[8];
}procedure;


typedef struct datefield
{
  char date[10];
}datefield;


typedef struct p45_clsgs
{
  procedure p45_clsg;
  datefield p45_clsgdte;
}p45_clsgs;

C#:

[StructLayout(LayoutKind.Sequential), Serializable]
struct procedure
{
//char code[];
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 8)]
public string code;
}
[StructLayout(LayoutKind.Sequential), Serializable]
struct datefield
{
//char date[10];
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 10)]
public string date;
}

struct p45_clsgs
{    
    public procedure p45_clsg;
    public datefield p45_clsgdte;
}

Подходят ли мои структуры C # для структур C?

Какова эквивалентная структура C # для следующей структуры c

typedef struct p45_cldxed24
{
  procedure p45_cldxed[8];
}p45_cldxed24;

person Raghuveer    schedule 08.02.2012    source источник
comment
это большой процесс, мне нужно создать как минимум 100 структур на С #, поэтому перед началом я хочу подтвердить себя   -  person Raghuveer    schedule 08.02.2012
comment
Лучший совет в этом случае - писать каждую структуру по одному и сравнивать размеры как в C, так и в C #.   -  person leppie    schedule 08.02.2012
comment
Черт возьми нет. Крыло. Как только он сломается, вы можете начать сходить с ума.   -  person Zenexer    schedule 08.02.2012
comment
@Zenexer: И тогда тебе все равно придется проделать все это упражнение ...   -  person leppie    schedule 08.02.2012
comment
@leppie Да, но ты чувствуешь себя продуктивным после хорошего часа.   -  person Zenexer    schedule 08.02.2012
comment
@Zenexer: А потом всю неделю жалко, потому что вы все еще не можете определить точную проблему.   -  person leppie    schedule 08.02.2012
comment
Ах, жизнь программиста ...   -  person Zenexer    schedule 08.02.2012


Ответы (2)


(Вычеркните мой исходный ответ)

Вам нужно, чтобы это было вверху каждой структуры:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]

Обратите внимание на именованный параметр CharSet. Это важно, иначе вы получите массивы wchar_t вместо массивов char.

person Zenexer    schedule 08.02.2012
comment
моя структура p45_clsgs верна? если да, если мне нужно объявить массив процедур в какой-то другой структуре, как мне это сделать - person Raghuveer; 08.02.2012
comment
Я соврал, это неправильно! Я соответствующим образом обновил свой ответ. Вы должны задать новый вопрос с примером структуры C, которую вам нужно для этого перевести. - person Zenexer; 08.02.2012
comment
CharSet.Ansi является ключевым. Кроме того, Marshal.SizeOf (typeof (x)), где x - одна из ваших структур, должен возвращать правильный размер - 8, 10 и 18 соответственно для ваших примеров. Без CharSet.Ansi их, вероятно, будет 16, 20 и 36. - person jeffora; 08.02.2012
comment
Как сказал Джеффора, вы можете использовать Marsha.SizeOf, чтобы получить реальный размер. Не используйте sizeof в небезопасном контексте - я почти уверен, что он увидит строки как указатели, хотя вы не должны верить мне на слово. (Это просто не будет работать в безопасном контексте.) - person Zenexer; 08.02.2012
comment
Какова эквивалентная структура C # для следующей структуры c typedef struct p45_cldxed24 {procedure p45_cldxed [8]; } p45_cldxed24; - person Raghuveer; 08.02.2012
comment
Создайте новый вопрос. Это может быть полезная информация для кого-то еще; мы бы не хотели скрывать это в комментариях. - person Zenexer; 08.02.2012
comment
stackoverflow.com/questions/9189254 / - person Raghuveer; 08.02.2012

Трудно сказать наверняка, учитывая, что вы не знаете, работает он или нет! Тем не менее, мне это кажется правильным.

Я бы порекомендовал просто протестировать эту структуру, которую вы здесь показали, и убедиться, что она работает так, как вы ожидаете. Затем приступайте к созданию других около 100 структур.

Если это поможет, взгляните на массив структур Marshal C ++ в C # и ссылки там.

person Ancallan    schedule 08.02.2012
comment
Какова эквивалентная структура C # для следующей структуры c typedef struct p45_cldxed24 {procedure p45_cldxed [8]; } p45_cldxed24; - person Raghuveer; 08.02.2012
comment
ссылка Попробуйте эту, она мне помогла с похожими проблемами - person Ancallan; 08.02.2012