Выделение структуры C в C # - PullRequest
1 голос
/ 09 июня 2010

Я не знаю, как упорядочить эту структуру в Mono.

typedef struct rib_struct {
    rib_used_t used;
    rib_status_t status;
    rib_role_t role;
    uint8_t conf;
    rib_dc_t *pending;
    pthread_mutex_t mutex;
    pthread_cond_t cond;
    rib_f_t *props;
} rib_t;

И, например, rib_dc_t выглядит так:

typedef struct rib_dc_struct {
    uint16_t id;
    uint8_t min_id;
    uint8_t conf;
    struct rib_dc_struct *next;
} rib_dc_t;

Я не знаю, какМаршалл pthread структуры.И указатели ... я должен использовать IntPtr или управляемые структуры?Как пометить указатель в последней структуре на саму структуру?

Спасибо в adanvaced

Ответы [ 2 ]

1 голос
/ 09 июня 2010

Это не намного сложнее, чем это. Вы также будете вынуждены объявить структуры pthread_mutex_t и pthread_cond_t. Не очень хорошо, это детали реализации, с которыми код C # не должен беспокоиться. Я бы порекомендовал вам использовать [StructLayout (LayoutKind.Explicit)], чтобы вы могли объявить только те элементы, которые необходимы для кода C #. Вам нужно написать небольшую тестовую программу на C / C ++, которая использует offsetof (), чтобы найти смещения членов.

Указатели должны быть объявлены как IntPtr. Вы должны сами упорядочить указанные значения с помощью Marshal.PtrToStructure (). Не уверен, сколько из этого покрыто Mono.

0 голосов
/ 09 июня 2010

Спасибо за ответ, Ганс. Мне наконец удалось избежать этой структуры, так что никаких проблем.

Остались только некоторые функции, которые я не знаю, как сделать маршалл.

int rib_init (rib_callbacks_t * cb, void * data);

rib_callbacks_t - это структура делегатов, подобная этой:

    [StructLayout(LayoutKind.Sequential)]
    internal struct rib_callbacks_t 
    {
        public NewDevConnectedCallback new_dev_connected;
        public DevDisconnectedCallback dev_disconnected;
        public DcConnectedCallback new_dc_connected;
    }

rib_feature_t * rib_register_feature (char * desc);

Я должен вернуть этот метод как IntPtr для отмены маршалла с Marshall.IntPtrToStructure, я не прав?

rib_feature_t ** rib_register_many_features (uint16_t * dev_type, char ** desc, int count);

Этот, которого я не знаю, как сделать маршалл. Двое ** сломали меня: (.

int rib_send (rib_dc_t * dc, const void * msg, size_t len); int rib_recv (rib_dc_t * dc, void * buf, size_t len);

В этих случаях я использовал [MarshalAs (UnmanagedType.LPArray)] byte [] buf / msg ... это нормально?

Привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...