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

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

1 голос
/ 08 февраля 2012

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

следующие примеры структур, которые у меня есть в c, я должен упорядочить эти структуры в моем коде 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;

Ответы [ 2 ]

3 голосов
/ 08 февраля 2012

(поцарапайте мой оригинальный ответ)

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

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

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

0 голосов
/ 08 февраля 2012

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

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

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

...