函数将指针指向结构

本文关键字:结构 指针 函数 | 更新日期: 2023-09-27 17:58:30

我在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);

我遇到一个错误,指针无法引用封送处理的结构,我该如何处理?

函数将指针指向结构

这里根本不需要使用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

由于您发布的本机代码中没有提到字符串长度,因此我假设字符串是由本机代码分配的,您不需要对任何内容进行解除分配。

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

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