函数将指针指向结构

时间:2013-02-09 00:52:48

标签: c# pinvoke

我在C

中有这个结构
struct system_info
{  
   const char *name;     
   const char *version;  
   const char *extensions; 
   bool        path;    
};

这个功能签名

void info(struct system_info *info);

我正在尝试使用这个函数:

[DllImport("...")]
unsafe public static extern void info(info *test);



[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public unsafe struct info
{
    public char *name;
    public char *version;
    public char *extensions;

    public bool path;
} 

在我的主要上:

info x = new info();
info(&x);

我收到错误,指针无法引用编组结构,我该如何管理呢?

2 个答案:

答案 0 :(得分:3)

这里根本不需要使用unsafe。我会这样做:

public struct info
{
    public IntPtr name;
    public IntPtr version;
    public IntPtr extensions;
    public bool path;
}

然后功能是:

[DllImport("...")]
public static extern void getinfo(out info value);

您可能需要指定Cdecl调用约定,具体取决于本机代码。

像这样调用函数:

info value;
getinfo(out value);
string name = Marshal.PtrToStringAnsi(value.name);
// similarly for the other two strings fields

由于在您发布的本机代码中没有提及字符串长度,我假设字符串是由本机代码分配的,并且您不需要任何内容​​来解除分配它们。

答案 1 :(得分:0)

通过使用ref而不是像Hans Passant提到的* test来解决

[DllImport("...")]
unsafe public static extern void info(ref system_info test);