如何在C#中声明一个返回结构指针的C函数?
我认为以下是一种方法,然后使用 Marshal.PtrToStructure 来获取实际结构值。
// C-function
SimpleStruct * Function(void);
// C# import
[DllImport("MyDll.dll")]
public static extern IntPtr Function();
答案 0 :(得分:4)
由于函数返回一个指针(希望不是本地分配的指针?),最好的办法是手动编组(通过Marshal.PtrToStructure)。
如果是参数,您可以使用PInvoke Interop Assistant创建结构的托管版本,然后通过ref或out传递它。
答案 1 :(得分:4)
警告:只有当返回的指针指向已由CLR管理的内存
时才会有效我相信你要找的是
// C# import
[DllImport("MyDll.dll")]
[return : MarshalAs(UnmanagedType.LPStruct)]
public static extern StructureName Function();
[StructLayout(LayoutKind.Sequential)]
public class StructureName {}
这样就不需要任何手动Marshal.PtrToStructure
来电。根据您的结构包含的内容,您可能需要根据需要使用MarshalAs
属性标记某些字段。 MSDN就是一个很好的例子。
答案 2 :(得分:0)
我根本不是这里的专家,但我碰巧看到的是一段代码(我完全不明白你的意思)也在做同样的事情。
这是他们正在做的事情
[DllImport("")]
private static extern short MethodName([In,Out] ref StructureName variable);
然后在结构上他们有以下属性
[StructLayout(LayoutKind.Sequential, Size = #)]
public struct StructureName {}
我认为您正在寻找的部分是[In,Out]部分,并且由于它是通过ref传递的,因此您应该获得相同的数据。
标记为社区维基,以便人们可以在错误时解决此问题。