将此C签名转换为C#以进行P / Invoke

时间:2009-08-24 17:29:12

标签: c# pointers struct pinvoke

我有以下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 个答案:

答案 0 :(得分:2)

每当您想要将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 :(得分:1)

这样的事情应该有效:


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将是ansi-strings,而不是unicode。

相关问题