Преобразование этой подписи C в C # для P / Invoke - PullRequest
0 голосов
/ 24 августа 2009

У меня есть следующая функция C:

int w_ei_connect_init(ei_cnode* ec, const char* this_node_name, 
                      const char *cookie, short creation);

ei_cnode выглядит так:

typedef struct ei_cnode_s {
    char thishostname[EI_MAXHOSTNAMELEN+1];
    char thisnodename[MAXNODELEN+1];
    char thisalivename[EI_MAXALIVELEN+1];
    char ei_connect_cookie[EI_MAX_COOKIE_SIZE+1];
    short creation;
    erlang_pid self;
} ei_cnode;

Который я преобразовал в C #:

[StructLayout(LayoutKind.Sequential)]
public struct cnode {
    [MarshalAsAttribute(UnmanagedType.ByValTStr, 
        SizeConst = Ei.MAX_HOSTNAME_LEN + 1)]
    public string thishostname;
    [MarshalAsAttribute(UnmanagedType.ByValTStr, 
        SizeConst = Ei.MAX_NODE_LEN + 1)]
    public string thisnodename;
    [MarshalAsAttribute(UnmanagedType.ByValTStr, 
        SizeConst = Ei.MAX_ALIVE_LEN + 1)]
    public string thisalivename;
    [MarshalAsAttribute(UnmanagedType.ByValTStr, 
        SizeConst = Ei.MAX_COOKIE_SIZE + 1)]
    public string ei_connect_cookie;
    public short creation;
    public erlang_pid self;
}

Я не очень хорошо разбираюсь с указателями или C, так что я не уверен, как мне поставить cnode на ei_connect_init.

Каким будет эквивалентная сигнатура C # для функции C выше?

Ответы [ 2 ]

2 голосов
/ 24 августа 2009

Всякий раз, когда вы хотите передать структуру C # в значение параметра, содержащее эквивалентную собственную структуру, но с указателем, типичным методом является пометить параметр как «ref». Это заставляет слой PInvoke по существу передавать адрес.

[DllImport("somedll")]
public static extern w_ei_connect_init(
  ref cnode v,
  [In] string this_node_name,
  [In] string cookie,
  int16 creation);
1 голос
/ 24 августа 2009

Примерно так должно работать:


int w_ei_connect_init(ref cnode ec, 
         [MarshalAs(UnmanagedType.LPStr)] string this_node_name, 
         [MarshalAs(UnmanagedType.LPStr)] string cookie, short creation);

Вы также должны пометить вашу структуру

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

атрибут, поэтому эти TStr будут анси-строками, а не юникодом.

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