函数将指针指向结构
本文关键字:结构 指针 函数 | 更新日期: 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);