p / invoke返回指向struct的指针的C函数

如何在C#中声明一个返回指向结构的指针的C函数?

我相信以下是一种方法,然后是Marshal.PtrToStructure来获得实际的结构值。

// C-function SimpleStruct * Function(void); // C# import [DllImport("MyDll.dll")] public static extern IntPtr Function(); 
  1. 我对此是否正确?
  2. 还有其他方法可以实现同样的目标吗? (可以按值返回结构)

由于函数返回一个指针(希望不是本地分配的指针?),最好的办法是手动编组(通过Marshal.PtrToStructure )。

如果它是一个参数,您可以使用PInvoke Interop Assistant创建结构的托管版本,然后通过ref或out传递它。

警告:这只有在返回的指针是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就是一个很好的例子。

我根本不是这里的专家,但我碰巧看到的是一段代码(我完全不明白你也是这样)。

这是他们正在做的事情

 [DllImport("")] private static extern short MethodName([In,Out] ref StructureName variable); 

然后在结构上他们有以下属性

 [StructLayout(LayoutKind.Sequential, Size = #)] public struct StructureName {} 

我认为你要找的部分是[In,Out]部分,因为它是通过ref传递的,所以你应该得到相同的数据。

标记为社区维基,以便人们可以解决这个问题。