我在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);
我收到错误,指针无法引用编组结构,我该如何管理呢?
答案 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);